サイトロゴ

Pythonではじめてのパッケージの作り方

著者画像
Toshihiko Arai

ゴール

この記事では、Pythonでパッケージを作る方法を紹介します。ChatGPT 4やググール検索を使って調べた結果をまとめています。

以下のようなパッケージを作ることを目標とします。

  • https://github.com/aragig/gifify
  • https://github.com/aragig/gspread_downloader

あくまでもGitHubに公開することを目標とします。PyPIに公開することは目標としません。

flowchart TD
    A[スタート] --> B[GitHubリポジトリの選定]
    B --> C[パッケージ用ディレクトリの作成]
    C --> D[ソースコードの準備]
    D --> E[setup.pyの作成]
    E --> F[依存関係の定義]
    F --> G[README.mdの作成]
    G --> H[テストの作成]
    H --> I[GitHubに公開]
    I --> J[終了]

    subgraph 定義
    E
    F
    end

    subgraph 準備
    B
    C
    D
    end

    subgraph 公開
    G
    H
    I
    end

GitHubへ公開後は、次のようにしてpipでインストール可能になります:

pip3 install git+https://github.com/aragig/gifify

パッケージに必要なファイル

例えば、FFmpegを使って動画からGIFアニメに変換するヘルパーパッケージ「gifify」の例をご紹介します。プロジェクトのディレクトリ構成は次の通りです:

$ tree -I 'build|__pycache__|gifify.egg-info'
.
├── README.md
├── gifify
│   ├── __init__.py
│   └── main.py
├── main.py
├── setup.py
└── tests
    ├── main.py
    ├── test.mov
    └── test_anime.gif

ここで大事なのは、setup.pygifiy ディレクトリです。setup.pyは次のようになります:

from setuptools import setup, find_packages

setup(
    name='gifify',
    version='0.1.0',
    packages=find_packages(),
    description='PythonからFFmpegをコールして動画をGIFアニメーション化',
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    author='Toshihiko Arai',
    author_email='i.officearai@gmail.com',
    license='MIT',
    url='https://github.com/aragig/gifify',
    install_requires=[
    ],
    classifiers=[
        'Programming Language :: Python :: 3',
        'License :: OSI Approved :: MIT License',
        'Operating System :: OS Independent',
    ],
    python_requires='>=3.9',
)

name がパッケージ名になります。先ほどの階層のように、パッケージ名前でディレクトリを作成し、その中にソースコードを配置します。パッケージの __init__.py には次のようにアクセス可能な関数を記述します。

from .main import convert_to_anime_gif

__all__ = ["convert_to_anime_gif"]

制作したパッケージに依存関係がある場合は、setup.pyinstall_requires に記述します。この例では、FFmpegを使っているので、install_requires には記述しません。

    install_requires=[
        'gspread',
        'oauth2client'
    ],

パッケージをpipでインストールする際に、これらの依存関係が自動的にインストールされます。

パッケージのインストール

パッケージをインストールするには、次のようにします:

pip3 install -e .

-e オプションを付けると、パッケージのソースコードが変更された場合に、自動的に更新されます。

GitHubに公開

またGitHubに公開後は、次のようにしてインストールします:

pip3 install git+https://github.com/aragig/gifify

ブランチやバージョン(タグ)指定も可能です。

pip3 install git+https://github.com/aragig/gifify@develop
pip3 install git+https://github.com/aragig/gifify@0.1.0

感想

Pythonでは兄弟ディレクトリのモジュール参照が非常に苦手です。パッケージ化することでディレクトリ階層を意識することなく、モジュールにアクセスできて便利になりました。また、依存関係も疎になりますので、再利用可能で保守管理しやすくなりました。 今後の課題としてパッケージのテスト方法や、 __init__.py の仕組みを学ぶ必要がありそうです。また、PyPIに公開できるようなパッケージの制作がいずれできたらと思います。

関連記事