lisz-works

プログラミングと興味を貴方に

Python3で自作パッケージを作ってインストール

【スポンサーリンク】

Python

こんにちは、lisです!

Pythonで何か作っていると色々なときに使うものとか出てきませんか?

パッケージとして扱えたらきっと楽ができる……!

ということで、Python3で自作パッケージを作ってインストールする方法についてです!

ディレクトリ構成

パッケージ作成するプロジェクトフォルダを作って、このような構成で中身を作ります。

.
├── 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

更新してくれるとはいえ、インタプリタの立ち上げ直しが必要なようです。

参考

コチラを参考にしました。ありがとうございました!

zenn.dev


www.lisz-works.com

www.lisz-works.com