Pythonではじめてのパッケージの作り方
この記事では、Pythonでパッケージを作る方法を紹介します。ChatGPT 4やググール検索を使って調べた結果をまとめています。
ゴール
以下のようなパッケージを作ることを目標とします。
- GitHub - aragig/gifify: PythonからFFmpegをコールして動画をGIFアニメーションにするパッケージ
- GitHub - aragig/gspread_downloader: Google Spreadsheet からシートをCSV形式でダウンロードし保存する機能の提供
あくまでもGitHubに公開することを目標とします。PyPIに公開することは目標としません。
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.pyと gifiy ディレクトリです。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',
)
from .main import convert_to_anime_gif
__all__ = ["convert_to_anime_gif"]
制作したパッケージに依存関係がある場合は、setup.py の install_requires に記述します。この例では、FFmpegを使っているので、install_requires には記述しません。
install_requires=[
'gspread',
'oauth2client'
],
パッケージをpipでインストールする際に、これらの依存関係が自動的にインストールされます。
パッケージのインストール
パッケージをインストールするには、次のようにします:
pip3 install -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に公開できるようなパッケージの制作がいずれできたらと思います。