こんにちは、lisです!
Pythonで何か作っていると色々なときに使うものとか出てきませんか?
パッケージとして扱えたらきっと楽ができる……!
ということで、Python3で自作パッケージを作ってインストールする方法についてです!
- ディレクトリ構成
- setup.py
- {package-name}/init.py
- {package-name}/{script-name}.py
- パッケージのインストール
- パッケージインストールするけど変更もする場合
- -eオプション指定時の動作について
- 参考
ディレクトリ構成
パッケージ作成するプロジェクトフォルダを作って、このような構成で中身を作ります。
. ├── setup.py └── {package-name} ├── __init__.py └── {script-name}.py
{package-name}/{script-name}.pyが実際に実行されるソースコードです。
パッケージ名を「test_package」とした場合の例です。
. ├── setup.py └── test_package ├── __init__.py └── test_package.py
setup.py
setup()のname引数にパッケージ名を設定します。
パッケージ名を「test_package」とした場合の例です。
from setuptools import setup, find_packages setup( name='test_package', version='0.1', packages=find_packages() )
{package-name}/init.py
対象パッケージ内の関数をimportします。
パッケージ名「test_package」の「test_package.py」をimportした場合の例です。
from test_package.test_package import *
{package-name}/{script-name}.py
実際の処理部分です。
例として、文字列を表示するだけの関数を作成します。
def show(): print('test_package.show')
パッケージのインストール
パッケージのインストールは、普段と同じくpip install
から行えます。
例えば下記のようなディレクトリ構成でパッケージ作成を行っているとします。
~/work/test_package ├── setup.py └── test_package ├── __init__.py └── test_package.py
このときのパッケージのインストールは、pip install
で~/work/test_package
を指定して上げればOKです。
相対パス/絶対パスどちらでも問題ないようなので
cd ~/work/test_package && pip install .
pip install ~/work/test_package
とかでインストールできます。
パッケージインストールするけど変更もする場合
またパッケージとしてインストールはするものの、パッケージは変更するかもしれない……
そんなときは-e
オプションを指定します。
# 例 $ pip install -e .
これでパッケージのソースを変更しても反映してくれます。
-eオプション指定時の動作について
まずtest_package.pyの中身をこんな感じで用意します。
def show(): print('test_package.show')
実行してみます。
>>> import test_package
>>> test_package.show()
test_package.show
ソースを改造します。
def show(): print('test_package.show!!!!!') def hello(): print('hello')
そのままのインタプリタでパッケージのリロードを行いましたが、NGでした。
>>> import importlib >>> importlib.reload(test_package) <module 'test_package' from '/home/sy/work/tmp/py-package/test_package/__init__.py'> >>> test_package.show() test_package.show >>> test_package.hello() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'test_package' has no attribute 'hello'
一度インタプリタを抜けて、再度入り直して見ると更新されました。
$ python Python 3.6.9 (default, Jun 29 2022, 11:45:57) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import test_package >>> test_package.show() test_package.show!!!!! >>> test_package.hello() hello
更新してくれるとはいえ、インタプリタの立ち上げ直しが必要なようです。
参考
コチラを参考にしました。ありがとうございました!