【Python】自作ライブラリのパッケージング方法
自分で開発したPythonプログラムを再利用しやすいように、ライブラリとして整備したいことがあると思います。本記事ではPythonプログラムをライブラリ化するための手順を解説します。Pythonプログラムののモジュール化に加えて、コマンドラインを作成する方法についても触れます。
目次
2022年12月31日追記: Poetryを使って自作パッケージを管理する方法についても記事にしましたのでよろしければそちらもご覧ください。
本記事ではPython 3.6.10を利用しています。
モジュールの作成
ディレクトリ構成
.
├── sample_lib
│ ├── __init__.py
│ ├── fuga.py
│ ├── hoge.py
│ └── submodule
│ ├── __init__.py
│ ├── piyo.py
├── sample_lib_cli
│ └── call.py
└── setup.py
このライブラリでは以下の3つの単純なクラスを実装しています。
sample_lib/fuga.py
class Fuga:
def __call__(self):
return 'Fuga'
sample_lib/hoge.py
class Hoge:
def __call__(self):
return 'Hoge'
sample_lib/submodule/piyo.py
class Piyo:
def __call__(self):
return 'Piyo'
パッケージ
Pythonのライブラリはパッケージが階層的に構成されています。
パッケージはファイルシステムのディレクトリのような概念だと思ってください。
通常のパッケージ (__init__.py
を含むディレクトリ) がimportされると、暗黙的に__init__.py
が実行されます。
つまり、import sample_lib
が実行されると、sample_lib/__init__.py
が実行されます。
例えば、 sample_lib/__init__.py
は次のように記述されているとすると、Fuga
とHoge
というクラスがsample_lib
というパッケージの名前空間に定義されます。つまり、import sample_lib
が実行されれば、sample_lib.Fuga
やsample_lib.Hoge
としてアクセスできるようになります。
from sample_lib.fuga import Fuga
from sample_lib.hoge import Hoge
また、 sample_lib/submodule/__init__.py
は次のように記述されているものとします。
from sample_lib.submodule import piyo
from sample_lib.submodule.piyo import Piyo
コマンドラインの作成
ライブラリを作成したら、それをecho
やls
のようにコマンドラインから利用することもできます。
コマンドラインの実装は sample_lib_cli/call.py
に記述するものとします。
ここでは、引数--name
に一致するクラスの呼び出し演算子 (__call__
) を実行するだけのコマンドラインを作成します。
import argparse
from sample_lib import (
Hoge,
Fuga
)
from sample_lib.submodule import Piyo
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--name', choices=['hoge', 'fuga', 'piyo'], default='hoge')
args = parser.parse_args()
if args.name == 'hoge':
x = Hoge()
elif args.name == 'fuga':
x = Fuga()
elif args.name == 'piyo':
x = Piyo()
print(x())
if __name__ == '__main__':
main()
setup.pyによるライブラリのパッケージング
ライブラリを作成したら、setup.py
を用意します。
setup.py
はライブラリをインストールしたり、配布したりするために利用します。
from setuptools import setup
install_requires = [
# 必要な依存ライブラリがあれば記述
]
packages = [
'sample_lib',
'sample_lib.submodule',
'sample_lib_cli',
]
console_scripts = [
'sample_lib_cli=sample_lib_cli.call:main',
]
setup(
name='sample_lib',
version='0.0.0',
packages=packages,
install_requires=install_requires,
entry_points={'console_scripts': console_scripts},
)
setup
関数の引数で以下を与えます。
name
: このライブラリの名前version
: このライブラリのバージョンpackages
: このライブラリが扱うパッケージinstall_requires
: このライブラリが依存するライブラリentry_points
: このライブラリを使ったスクリプトを生成するための辞書。console_scripts
をkeyとして与えたものがコマンドラインとして作成されます。上記の例では、sample_lib_cli
というコマンドラインを実行するとsample_lib_cli/call.py
のmain
関数が実行されるように指定しています。
配布用ソースコードの作成
配布用ソースコードを作成するには以下を実行します。
$python setup.py sdist
上記の実行終了後にsample_lib-0.0.0.tar.gz
というファイルがdist
以下に作成されます。
ライブラリのインストール
ライブラリをインストールするには以下を実行します。
$python setup.py install
上記の実行終了後に、ライブラリがインストールされます。
またコマンドラインもインストールされます。
以下のように実行すると、sample_lib_cli/call.py
のmain
関数が実行されます。
$sample_lib_cli --name hoge
Hoge
$sample_lib_cli --name piyo
Piyo
まとめ
本記事では自作したPythonライブラリをパッケージ化し、コマンドラインから利用する方法を説明しました。