PythonのCLIパッケージの作り方

2018年7月23日

Python

目次

  1. ディレクトリ構成
  2. setup.py
  3. requirements.txt
  4. entry_points
  5. 動作確認
  6. 配布用パッケージの作成
  7. 配布用パッケージのインストール

ディレクトリ構成

公式の How To Package Your Python Code — Python Packaging Tutorial にかかれている構成にします。プロジェクトの構造化 — The Hitchhiker's Guide to Python で紹介されているディレクトリ構造も参考になります。

今回の例では以下のような構成にしました。

samplecli
├── sample
│   ├── __init__.py
│   └── core.py
├── requirements.txt
└── setup.py

setup.py

setup.py にパッケージの情報と利用するパッケージ情報を書いていきます。setup.py について詳しくは Welcome to Setuptools’ documentation!2. Writing the Setup Script — Python 3.7.0 documentation が参考になります。

setup.py

from setuptools import setup, find_packages
with open('requirements.txt') as requirements_file:
    install_requirements = requirements_file.read().splitlines()
setup(
    name="samplecli",
    version="0.0.1",
    description="A small package",
    author="karakaram",
    packages=find_packages(),
    install_requires=install_requirements,
    entry_points={
        "console_scripts": [
            "sample=sample.core:main",
        ]
    },
    classifiers=[
        'Programming Language :: Python :: 3.6',
    ]
)

requirements.txt

requirements.txt に必要なパッケージを書いていきます。例えば requests が必要な場合は以下のように書きます。

requirements.txt

requests==2.19.1

複数人で開発できるように、パッケージのバージョンは固定しておくと良いと思います。

entry_points

次に CLI パッケージの処理内容を実装していきましょう。冒頭で紹介したように、ディレクトリ構成は以下のようになっています。

samplecli
├── sample
│   ├── __init__.py
│   └── core.py

さきほど setup.py の entry_points に sample/core.py の main 関数を指定しました。

setup.py

setup(
    ...
    entry_points={
        "console_scripts": [
            "sample=sample.core:main",
        ]
    },
    ...
)

core.py の main 関数を以下のように実装しましょう。標準出力に Hello World! と表示するだけの簡単なプログラムです。

core.py

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def main():
    logger.info('Hello World!')

動作確認

それではこれまでのコードを実行してみましょう。パッケージの動作確認をするには、以下のコマンドを実行します。

$ python setup.py develop

実行結果にインストール先が書かれているので探します。私の環境では ~/.pyenv/versions/3.6.5/bin/ にインストールされました。

...
Installing sample script to /Users/karakaram/.pyenv/versions/3.6.5/bin
...

インストールされたファイルを実行してみます。

$ ~/.pyenv/versions/3.6.5/bin/sample

INFO:sample.core:Hello World!

Hello World が表示されました。以降は、python setup.py develop を実行しなくても、変更が即座に反映されるので、簡単にデバッグができます。

配布用パッケージの作成

他の環境にパッケージを配布するには、以下のコマンドで他の環境に配布するためのパッケージを作成します。

$ python setup.py sdist

dist ディレクトリに tar.gz ファイルが作成されます。

samplecli
├── dist
│   └── samplecli-0.0.1.tar.gz

配布用パッケージのインストール

このファイルを http でアクセスできるところの置いて、pip コマンドの引数にファイルの URL を指定することでパッケージをインストールできます。

$ pip install https://${host}/samplecli-0.0.1.tar.gz

配布先でパッケージを実行してみます。Hello World が表示されました。

$ sample

INFO:sample.core:Hello World!

パッケージを外部公開せず、内部のみで利用するパッケージなら S3 あたりに置いてアクセス制限しながら運用するのが良いと思います。PyPI に公開する場合は Publishing On PyPI が参考になります。

-技術ブログ
-