PythonのパッケージをPyPIに公開する手順

プログラミング

PythonパッケージをPyPIに公開する手順

PythonパッケージをPyPI(Python Package Index)に公開することは、世界中のPython開発者があなたのライブラリを利用できるようにするための重要なステップです。ここでは、その手順を包括的に解説します。

1. パッケージの準備

PyPIに公開するためには、いくつかの準備が必要です。

1.1. パッケージ構造の整理

あなたのPythonコードを、パッケージとして適切に構造化します。通常、以下のようになります。

“`
your_package/
├── your_package/
│ ├── __init__.py
│ ├── module1.py
│ └── module2.py
├── tests/
│ ├── __init__.py
│ └── test_module1.py
├── setup.py
├── README.md
├── LICENSE
└── requirements.txt (任意)
“`

* `your_package/`: このディレクトリがあなたのパッケージ名となります。
* `your_package/__init__.py`: このファイルが存在することで、Pythonはこのディレクトリをパッケージとして認識します。
* `setup.py`: パッケージのメタデータやビルド方法を定義する重要なファイルです。
* `README.md`: パッケージの説明、インストール方法、使用例などを記載します。PyPI上で表示されます。
* `LICENSE`: パッケージのライセンスを記載します。オープンソースライセンス(MIT, Apache 2.0など)を選択するのが一般的です。

1.2. `setup.py` の作成

`setup.py` は、パッケージのビルドと配布を管理するスクリプトです。`setuptools` ライブラリを使用します。

“`python
from setuptools import setup, find_packages

setup(
name=’your-package-name’, # PyPIに公開されるパッケージ名 (小文字、ハイフン区切り)
version=’0.1.0′, # パッケージのバージョン
author=’Your Name’, # 作者名
author_email=’your.email@example.com’, # 作者のメールアドレス
description=’A short description of your package’, # 短い説明
long_description=open(‘README.md’).read(), # README.mdの内容を長文説明として使用
long_description_content_type=’text/markdown’, # 長文説明のコンテンツタイプ
url=’https://github.com/yourusername/your-package-name’, # リポジトリのURL
packages=find_packages(), # 自動的にパッケージを検出
classifiers=[
# PyPIでパッケージを分類するためのタグ
‘Programming Language :: Python :: 3’,
‘License :: OSI Approved :: MIT License’,
‘Operating System :: OS Independent’,
],
python_requires=’>=3.6′, # 必要なPythonのバージョン
install_requires=[
# 依存パッケージのリスト
‘numpy>=1.20’,
‘pandas’,
],
extras_require={
# オプションの依存パッケージ (例: extra_install)
‘extra_install’: [‘scikit-learn’],
},
entry_points={
# コマンドラインツールとして公開する場合
‘console_scripts’: [
‘your-command = your_package.module1:main_function’,
],
},
)
“`

* `name`: PyPI上でのユニークなパッケージ名です。通常、小文字でハイフン区切りが推奨されます。
* `version`: SemVer (Semantic Versioning) に従うのが一般的です。
* `packages`: `find_packages()` は、`setup.py` と同じディレクトリにあるパッケージを自動的に見つけます。
* `classifiers`: PyPIで検索されやすくなるための分類タグです。
* `install_requires`: このパッケージが動作するために必須の他のパッケージを指定します。
* `entry_points`: パッケージをコマンドラインツールとして使用できるようにする場合に定義します。

1.3. README.md の作成

パッケージの目的、インストール方法、基本的な使い方、貢献方法などを分かりやすく記述します。

1.4. LICENSE ファイルの作成

MITライセンス、Apache 2.0ライセンスなど、適切なオープンソースライセンスを選択し、その内容を `LICENSE` ファイルに記述します。

2. PyPI アカウントの作成と認証情報の設定

PyPIにパッケージをアップロードするには、PyPIのアカウントが必要です。

2.1. PyPI アカウントの作成

2.2. API トークンの生成

PyPIにアップロードするには、APIトークンを使用するのが推奨されています。PyPIの「Account settings」>「API tokens」から新しいトークンを作成します。スコープは「Entire account」ではなく、「This project only」で、公開するパッケージ名に限定するのがセキュリティ上望ましいです。生成されたトークンは、後で必要になるため、安全な場所に保管してください。

2.3. ローカル環境での認証情報の設定

`twine` というツールを使用してパッケージをアップロードします。`twine` は、PyPIへの認証のために、ユーザー名とパスワード、またはAPIトークンを使用します。

APIトークンを使用する場合、以下のコマンドで認証情報を設定します。

“`bash
# .pypirc ファイルに保存する場合
echo “[distutils]” > ~/.pypirc
echo ” index-servers = pypi” >> ~/.pypirc
echo “” >> ~/.pypirc
echo “[pypi]” >> ~/.pypirc
echo ” username = __token__” >> ~/.pypirc
echo ” password = YOUR_API_TOKEN” >> ~/.pypirc # ここに生成されたAPIトークンを貼り付けます
“`

APIトークンは、直接 `.pypirc` に書くのではなく、環境変数 `TWINE_USERNAME` と `TWINE_PASSWORD` に設定することも推奨されています。

“`bash
export TWINE_USERNAME=”__token__”
export TWINE_PASSWORD=”YOUR_API_TOKEN”
“`

### 3. パッケージのビルド

パッケージをPyPIにアップロードするためには、ビルドする必要があります。

3.1. 必要なツールのインストール

`build` および `twine` をインストールします。

“`bash
pip install build twine
“`

3.2. ソースディストリビューションと wheel のビルド

プロジェクトのルートディレクトリ(`setup.py` がある場所)で、以下のコマンドを実行します。

“`bash
python -m build
“`

これにより、`dist/` ディレクトリに `.tar.gz` (ソースディストリビューション) と `.whl` (wheel) ファイルが生成されます。これらがPyPIにアップロードされるファイルです。

### 4. テストアップロード (TestPyPI)

いきなり本番のPyPIにアップロードするのはリスクが伴います。まずは、テスト用のPyPIである TestPyPI を使用して、アップロードプロセスを確認しましょう。

4.1. TestPyPI アカウントの作成

Create an account
The Python Package Index (PyPI) is a repository of software for the Python programming language.
(https://test.pypi.org/account/register/) からアカウントを作成します。TestPyPI 用の新しいアカウントを作成してください。

4.2. TestPyPI へのアップロード

`twine` を使用して、TestPyPI にビルドしたパッケージをアップロードします。

“`bash
twine upload –repository testpypi dist/*
“`

このコマンドを実行すると、TestPyPI のユーザー名とパスワード(またはAPIトークン)の入力を求められます。TestPyPI 用に設定した認証情報を使用してください。

4.3. アップロードの確認

アップロードが成功したら、
Client Challenge
(https://test.pypi.org/project/your-package-name/) でパッケージが正しく表示されているか確認します。

4.4. TestPyPI からの削除 (任意)

テストアップロードしたパッケージは、必要に応じて TestPyPI から削除できます。

### 5. PyPI への本番アップロード

テストが成功したら、いよいよ本番のPyPIにアップロードします。

5.1. PyPI へのアップロード

TestPyPI と同様のコマンドで、今度は本番のPyPIにアップロードします。

“`bash
twine upload dist/*
“`

このコマンドを実行すると、PyPI のユーザー名とパスワード(またはAPIトークン)の入力を求められます。本番のPyPI用に設定した認証情報を使用してください。

5.2. アップロードの確認

アップロードが成功したら、
Client Challenge
(https://pypi.org/project/your-package-name/) でパッケージが正しく表示されているか確認します。

6. パッケージの更新と管理

パッケージを公開した後も、バグ修正や機能追加のために更新を行う必要があります。

6.1. バージョンの更新

`setup.py` の `version` を新しいバージョン番号に変更します。

6.2. 再ビルドとアップロード

変更後、再度 `python -m build` を実行してビルドし、`twine upload dist/*` でPyPIにアップロードします。

6.3. バージョン履歴の管理

SemVer に従い、メジャー、マイナー、パッチバージョンを適切に更新することが、ユーザーにとって分かりやすい管理に繋がります。

7. その他の考慮事項

* **パッケージ名:** PyPIでは、パッケージ名はユニークである必要があります。公開前に PyPI で検索し、既存のパッケージ名と重複しないか確認してください。
* **自動化:** CI/CD (Continuous Integration/Continuous Deployment) ツール(GitHub Actions, GitLab CIなど)と連携させることで、テスト、ビルド、アップロードのプロセスを自動化できます。
* **ドキュメント:** Read the Docs などのサービスを利用して、パッケージのドキュメントをホストし、リンクを `setup.py` に含めることを検討してください。
* **テスト:** 充実したテストスイートは、パッケージの品質を保証し、ユーザーからの信頼を得るために不可欠です。

まとめ

PyPIへのパッケージ公開は、いくつかのステップを踏むことで実現できます。パッケージの準備、`setup.py` の設定、ビルド、そしてTestPyPIでのテストを経て、本番のPyPIへアップロードします。このプロセスを理解し、丁寧に進めることで、あなたのPythonライブラリを世界中の開発者と共有することができます。