Masayan tech blog.

  1. ブログ記事一覧>
  2. PyPI(パイピーアイ)にPythonの自作パッケージを公開する方法

PyPI(パイピーアイ)にPythonの自作パッケージを公開する方法

公開日

環境

  • macOS Ventura v13.5.2
  • Python 3.10.5

全体の流れ

  1. TestPyPI, PyPI のアカウント登録
  2. GitHubリポジトリ作成
  3. 公開するパッケージの作成
  4. TestPyPI
  5. PyPI
  6. パッケージを改修する場合

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についてはこちらの記事を参照されたし

Pythonの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の自作パッケージを公開する方法を紹介しています。是非参考にしてみてください。