環境
- macOS Ventura v13.5.2
- Python 3.10.5
全体の流れ
- TestPyPI, PyPI のアカウント登録
- GitHubリポジトリ作成
- 公開するパッケージの作成
- TestPyPI
- PyPI
- パッケージを改修する場合
TestPyPI, PyPI のアカウント登録
TestPyPI
PyPIの公開プロセスを試せるサイト。メールアドレスやアカウント名等を登録し、メールアドレスから認証。必要に応じて二要素認証の設定を行う
PyPI
pythonパッケージを公開できるサイト。こちらもメールアドレスやアカウント名等を登録し、メールアドレスから認証。必要に応じて二要素認証の設定を行う
認証ファイルを作成
APIトークンを取得し、$HOME/.pypircを作成し以下を記述(二要素認証していない場合はトークンは不要で、usernameとpasswordをそのまま指定すればOK)
[pypi]
username = __token__
password = <your TestPyPI api token>
[testpypi]
username = __token__
password = <your TestPyPI api token>
APIトークンは、マイページから生成できるので、これを指定
このファイルを作成しておけば、公開する際に毎回認証情報の入力をせずに済む
GitHubリポジトリ作成
Publicリポジトリで、.gitignoreをpythonで選択、ライセンスMIT。それ以外はお好みで選択し作成。作成できたら、git cloneしてローカルに落としておく
公開するパッケージの作成
パッケージの作成に必要なライブラリをインストール
cloneしたディレクトリに移動し、パッケージの作成に必要なライブラリをインストール。 build
はパッケージング用(ビルド済みパッケージ配布形式の標準)、twine
はPyPIアップロード用(ビルド成果物のアップロード)。以降の作業は基本的にvenv仮想環境内で行う。
python3 -m venv .venv
source .venv/bin/activate
(.venv) python3 -m pip install --upgrade pip
(.venv) python3 -m pip install build twine
venvについてはこちらの記事を参照されたし
モジュールの作成
ディレクトリ構造は以下。本記事公開時点では、setup.pyではなくpyproject.tomlを使った公開手順が標準的な方法となっているのでこちらの方法で進める
taopypy/
__init__.py
.gitignore
LICENSE
pyproject.toml
README.md
最終的にこのパッケージを使用する際は、この作成したディレクトリの名前でimportすること可能
__init__.py
import numpy as np
def main() -> None:
a = np.array([1, 5, 12, 0, 5, 1])
print(np.mean(a))
pyproject.tomlの作成
こちらをもとに作成する。
- name
パッケージ名 - authors
作者名, 作者のメールアドレス - description
パッケージの概要
- classifiers
pythonバージョン、osの互換性、ライセンスの指定など必要に応じて行う
- dependencies
作成するパッケージが依存しているライブラリがあれば記述。今回自作しているパッケージをインストーする際にこのdependenciesもインストールされる
- project.url
githubのリポジトリのurl
[project]
name = "taopypy"
version = "0.0.1"
authors = [{ name="masayan1126", email="masayan1126@gmail.com" }]
description = "This is masayan1126's utility python package"
readme = "README.md"
requires-python = ">=3.10"
classifiers = [
"Programming Language :: Python :: 3.10",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
dependencies = [
'numpy',
]
[project.optional-dependencies]
dev = [
"build",
"twine",
]
[project.urls]
"Homepage" = "https://github.com/masayan1126/taopypy"
"Bug Tracker" = "https://github.com/masayan1126/taopypy/issues"
作成したパッケージをインストール
以下を実行すると、PyPIに公開する前にパッケージをモジュールとして擬似的に使用することが可能になる
(.venv) pip install -e .
// コマンドラインから実行
(.venv) python3
>>> import taopypy
>>> taopypy.main()
4.0
これで動作検証はできたので、続いて公開手順に進む。TestPyPI⇨PyPIの順
TestPyPI
アップロード
ビルド
(.venv) python3 -m build
TestPyPIにビルド成果物をアップロード
(.venv) python3 -m twine upload --repository testpypi dist/*
TestPyPI の username と password の入力($HOME/.pypircを設定していれば不要)
Enter your username:
Enter your password:
アップロードが完了したらコンソールに表示されるパッケージのurlにアクセスできることを確認する
公開したパッケージを使う
--index-url
: test.pypi.org を使う事を明示的に指定--no-deps
: 他のパッケージに依存している場合、test.pypi.org からはインストールできないのでこのオプションを使って依存を無視する(今回であればnumpy)
(.venv) python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps taopypy
PyPI
アップロード
(.venv) python3 -m twine upload --repository pypi dist/*
アップロードが完了したらコンソールに表示されるパッケージのurlにアクセスできることを確認する
公開したパッケージを使う
他の適当なプロジェクトでvenv仮想環境を作り公開したパッケージをインストール
(.venv) pip install taopypy
main.pyで呼び出して実行
import taopypy
taopypy.main()
main.pyを実行し、計算結果が出力されていれば成功
(.venv)python3 main.py
4.0
パッケージを改修する場合
pyproject.tomlのバージョンを変更した上で「<パッケージ名>.egg-info」と「dist」の中に作成されたファイルを削除し、再度ビルド、アップロードを行う。同一のパッケージでバージョンが同じままだとアップロードに失敗するので注意。
まとめ
いかがでしたでしょうか。本記事では、PyPI(パイピーアイ)にPythonの自作パッケージを公開する方法を紹介しています。是非参考にしてみてください。