目次
環境
- 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 twinevenvについてはこちらの記事を参照されたし
モジュールの作成
ディレクトリ構造は以下。本記事公開時点では、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パッケージの概要 
- classifierspythonバージョン、osの互換性、ライセンスの指定など必要に応じて行う 
- dependencies作成するパッケージが依存しているライブラリがあれば記述。今回自作しているパッケージをインストーする際にこのdependenciesもインストールされる 
- project.urlgithubのリポジトリの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 buildTestPyPIにビルド成果物をアップロード
(.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 taopypyPyPI
アップロード
(.venv) python3 -m twine upload --repository pypi dist/*アップロードが完了したらコンソールに表示されるパッケージのurlにアクセスできることを確認する

公開したパッケージを使う
他の適当なプロジェクトでvenv仮想環境を作り公開したパッケージをインストール
(.venv) pip install taopypymain.pyで呼び出して実行
import taopypy
taopypy.main()main.pyを実行し、計算結果が出力されていれば成功
(.venv)python3 main.py 
4.0パッケージを改修する場合
pyproject.tomlのバージョンを変更した上で「<パッケージ名>.egg-info」と「dist」の中に作成されたファイルを削除し、再度ビルド、アップロードを行う。同一のパッケージでバージョンが同じままだとアップロードに失敗するので注意。
まとめ
いかがでしたでしょうか。本記事では、PyPI(パイピーアイ)にPythonの自作パッケージを公開する方法を紹介しています。是非参考にしてみてください。
