🐍

【Python】PyPI に自作パッケージを登録する手順まとめ

2020/11/16に公開

多分 Python Packaging User Guide を読むのが一番早いと思います。
(割とgoogle翻訳でもちゃんと日本語が成り立ってて驚いた)

が、疑問とか手順の追加/入れ替えがいくらか発生したのでメモ。
※ GitHub にリポジトリを置くのが前提です。

手順

以下、echidna というパッケージ名の場合。

PyPI のアカウント登録

TestPyPIPyPI の両方に登録
https://test.pypi.org/user/1ntegrale9/
https://pypi.org/user/1ntegrale9/

GitHubでリポジトリを作る

設定は以下の通り。

  • Public
  • Initialize this repository with a README
  • Add .gitignore: Python
  • Add a license: MIT License

作ったらローカルに git clone しておく。

必要なパッケージのインストール

$ python3 -m pip install --user --upgrade setuptools wheel twine

setuptoolswheel はパッケージング用
twineはPyPIアップロード用

モジュールの作成

$ mkdir echidna
$ touch echidna/__init__.py

このディレクトリの名前でimportすることになる。
echidna/__init__.py の中身は

name = "echidna"

と記述しておく。
後で以下を試すことになる。

import echidna
echidna.name

setup.py の作成

setup.py はパッケージのインストールに必要なファイル。

Creating setup.py Python Packaging User Guide
のサンプルをコピーしてちょっと書き換える。

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="echidna",
    version="0.0.1",
    author="1ntegrale9",
    author_email="1ntegrale9uation@gmail.com",
    description="BOT and CLI framework for handling multiple services in python",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/1ntegrale9/echidna",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3.7",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

author author_emailは当然各個人で違うので自分のものを。
nameはパッケージ名に。
descriptionは適当にパッケージの簡単な説明を。
urlはGitHubのURLでよい。
classifiersは書き換える必要なさそうだったけれども、
Python3系全体保証するのは怖かったので3.7に限定しておいた。

ローカルインストール

setup.py があれば pip install と同じことがローカルでできる。
build dist egg-info の作成も発生する)

$ python3 setup.py install

インストールできたら以下を試す。

$ python3
>>> import echidna
>>> echidna.name
'echidna'

大丈夫なら一旦アンインストールしておく。

python3 -m pip uninstall echidna

build dist egg-info も消しておく。

PyPIへのアップロード

まずは公式のコマンドに従ってパッケージング

$ python3 setup.py sdist bdist_wheel

TestPyPIにアップロードする

$ python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

この時 TestPyPI の username と password の入力を求められる

Enter your username:
Enter your password:

アップロードできたら、TestPyPI から pip install してみる

$ python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps echidna

大丈夫そうならuninstallしておく。

python3 -m pip uninstall echidna

PyPIにアップロード

$ python3 -m twine upload dist/*

pip install してみる。

python3 -m pip install echidna

おわり。

補足

TestPyPI に登録したパッケージを一旦削除して再度アップロードし直そうとしたら、
削除しても名前空間が保持されててできなかった(よく考えれば当たり前)
何かしらミスっても削除はしない方がよい。

Discussion