便利なツールを作成したら、ぜひみんなにも使ってもらいたいものです。PythonではPyPIというパッケージを登録するサイトがあり、ここに登録することでpip install
などでインストールすることができるようになります。
本文書では、その手順を紹介したいと思います。
注意: 古い方法について
・・・と思ってGoogleで検索すると、現在では推奨されない古い方法がたくさん引っかかります。以下は古い方法の代表例なので、注意をしてください。
-
setup.py
でdistutils
を使っている- 現在は
setuptools
を使うのが推奨です
- 現在は
-
.pypirc
にdistutils
の記載がある- 現在は必要ありません
-
python setup.py register
やpython setup.py sdist upload
を使っている- これらは平文のHTTP/認証されていないHTTPSの通信を利用するため、利用が非推奨となっています(PyPIにログインするユーザー名/パスワードを盗まれる危険性がある)。
- 現在は
twine
というパッケージ公開用ツールの使用が推奨されているので、こちらを利用しましょう。
事前準備
PyPIにパッケージを公開する前に、以下の事前準備が必要です。
- PyPIへのアカウント登録
- アカウント認証情報を記載した
.pypirc
の配置(オプション)
PyPIへのアカウント登録
以下から、PyPIのアカウントを作成しましょう。
アカウント認証情報を記載した.pypirc
の配置
アップロードするたびにユーザー名やパスワードを入力するのがめんどくさい、という場合はホームディレクトリの直下に.pypirc
を作成し、そこに認証情報を記載しておくことができます。
[pypi]
username = <username>
password = <password>
ただ、当然このファイルは暗号化されているわけではなく、中身が平文で晒されることになるので注意してください。
PyPIへの登録
では、PyPIへの登録を行なっていきます。解説のため、以下のような構成となっているライブラリを例にとります。
YOUR-PROJECT-FOLDER
├── CHANGES.txt (OPTIONAL)
├── LICENSE.txt
├── README
├── setup.py
└── your_package (FOLDER)
├── __init__.py
├── ...
└── subpackage (FOLDER)
├── __init__.py
setup.py
の用意
この構成の中で重要な役割を担うのが、ライブラリのパッケージ化処理を記述するsetup.py
です。中身は以下のような形になります。
from setuptools import setup
requires = ["requests>=2.14.2"]
setup(
name='your_package',
version='0.1',
description='Awesome library',
url='https://github.com/whatever/whatever',
author='yourname',
author_email='your@address.com',
license='MIT',
keywords='sample setuptools development',
packages=[
"your_package",
"your_package.subpackage",
],
install_requires=requires,
classifiers=[
'Programming Language :: Python :: 3.6',
],
)
-
name
: パッケージの名前です。実際のパッケージフォルダ名と合わせましょう -
version
: パッケージのバージョンです。アップデートするときは、ここを変更する必要があります。 -
packages
: インストール対象となるパッケージを指定します。サブパッケージがある場合は、それを指定する必要がある点に注意してください。このパッケージは全部なんだよ!という場合はfind_packages
を使うと良いです。 -
install_requires
: パッケージが依存するライブラリがあれば記載します。記法はpip freeze
で得られる形式と同一です -
classifiers
/keywords
: パッケージを検索するときのタグやキーワードを記載できます。classifiers
の一覧はこちらです
なお、download_url
にGitHubのアーカイブリンクを載せる例が多数ありますが、GitHub側からダウンロードしてほしいという要望がない限り不要です(そもそも、uploadするなら不要なはず)。多くのライブラリのsetup.py
にもdownload_url
の記載はありません。
実際にはもっといろいろなことを行うことができますが、基本的には上記が満たされていれば大丈夫です。詳細は公式のサンプルプロジェクトがあるため、そちらを参照すると良いと思います。
また、有名ライブラリのsetup.py
を見てみるのも良いでしょう。
このsetup.py
があれば、ライブラリのパッケージ化が行えます。
ライブラリのパッケージング
setup.py
が作成できたら、以下のコマンドでパッケージ化を行うことができます。
python setup.py sdist
sdist
とは"source distribution”の意味で、その名の通りソースコードベースの配布になります。そのためpip install
を行う際にはユーザー側でsetup.py
の記載に基づいたビルド処理が実行されます。
このビルド処理がOSによって異なる、Python2と3で・・・とかいろいろ問題をはらむ場合、ビルド済みのパッケージを配布することも可能です。それに利用されるのが、wheelになります。このwheelの登場により、Windowsでエラーが出たみたいなことがだいぶなくなりました。
wheelを利用するには、まずwheelをインストールします。
pip install wheel
wheelをインストールするとbdist_wheel
のオプションが使えるようになるので、それでパッケージングを行います。
python setup.py bdist_wheel
wheelの使い方も深いためここでは深く触れませんが、多様なプラットフォームで安全なインストールを提供したい場合は、wheel形式を検討すると良いと思います。
ライブラリのアップロード
では、いよいよアップロードを行います。まず、事前にアップロードに必要なtwine
をインストールしておきます。
pip install twine
あとは、パッケージングしたフォルダをアップロードするだけです。
twine upload dist/*