自分で開発したPythonプログラムを再利用しやすいように、ライブラリとして整備したいことがあると思います。本記事ではPythonプログラムをライブラリ化するための手順を解説します。Pythonプログラムののモジュール化に加えて、コマンドラインを作成する方法についても触れます。

目次

2022年12月31日追記: Poetryを使って自作パッケージを管理する方法についても記事にしましたのでよろしければそちらもご覧ください。

【Python】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 は次のように記述されているとすると、FugaHogeというクラスがsample_libというパッケージの名前空間に定義されます。つまり、import sample_libが実行されれば、sample_lib.Fugasample_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

コマンドラインの作成

ライブラリを作成したら、それをecholsのようにコマンドラインから利用することもできます。 コマンドラインの実装は 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.pymain関数が実行されるように指定しています。

配布用ソースコードの作成

配布用ソースコードを作成するには以下を実行します。

$python setup.py sdist

上記の実行終了後にsample_lib-0.0.0.tar.gzというファイルがdist以下に作成されます。

ライブラリのインストール

ライブラリをインストールするには以下を実行します。

$python setup.py install

上記の実行終了後に、ライブラリがインストールされます。 またコマンドラインもインストールされます。 以下のように実行すると、sample_lib_cli/call.pymain関数が実行されます。

$sample_lib_cli --name hoge
Hoge
$sample_lib_cli --name piyo
Piyo

まとめ

本記事では自作したPythonライブラリをパッケージ化し、コマンドラインから利用する方法を説明しました。


関連記事






最近の記事