PyPIデビューしたので方法をメモ

概要

py-spy-kwというパッケージをPyPI (The Python Package Index)に登録しました。いろいろ大変だったので、方法をメモしておきます。
PyPI
https://pypi.org/project/py-spy-kw/
Test_PyPI
https://test.pypi.org/project/py-spy-kw/
Git
https://github.com/Rosyuku/py-spy

手順

アップロードまでの大まかな手順を以下図に示します。本記事では自作パッケージの作成及びsetup.pyまでの対応は出来ている(赤枠は済みとする)として、青部分の内容を記載します。

PyPI及びTest PyPIのアカウント作成

以下2つのサイトにアクセスしてRegisterからアカウント登録を実施します。hotmailに何故か認証メールが飛ばなかったことを除き、特に困ったことはありませんでした。なお、test.pypiの方への登録は必須ではありませんが、PyPIへの登録が思った通りにできないなどいろいろあったので、まずはtest.pypiで練習した方が安全だと思います。
https://test.pypi.org/
https://pypi.org/

.pypircファイルの作成

.pypircファイルとは、Test PyPIや本番のPyPIにライブラリを使ってアクセスする場合の認証情報として用いられるファイルです。以下のような感じで、それぞれのrepositoryごとのURLと認証情報を記載します。なお、repositoryのパスが変わることがあるようで、その場合はアップロードした時に正しいURLが示されるのでそこに変えましょう。

[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository=https://upload.pypi.org/legacy/ 
username=***************
password=***************

[testpypi]
repository=https://test.pypi.org/legacy/
username=***************
password=***************

ファイルの置き場は~./です。~./.pypircという感じですね。~./がどこかわからないという人は以下のようなコマンドでどこを指しているか確認するとよいと思います。

cd ~

Test PyPIへのアップロードと検証

ここからアップロード作業に移ります。

事前準備

PyPIへのアップロードを実施する前に以下のパッケージをインストールしておく必要があります。

pip install twine #PyPIとのやり取りに使う
pip install wheel #バイナリファイルをアップロードする場合

wheelについて説明する前にpip installで何が行われている確認しておくと、以下に示すように、1で要求事項の確認、2で依存性の解決、3でwheelファイルのビルド、4でパッケージのインストール、とあります。

Pip install has several stages:
1. Identify the base requirements. The user supplied arguments are processed here.
2. Resolve dependencies. What will be installed is determined here.
3. Build wheels. All the dependencies that can be are built into wheels.
4. Install the packages (and uninstall anything being upgraded/replaced).

https://pip.pypa.io/en/stable/reference/pip_install/

3はクライアント側でsetup.pyからバイナリファイルをビルドするわけですが、この際OSやCPUのバージョンに応じてビルドのエラーが発生するリスクがあります。そこでアップロード側であらかじめ特定の環境でビルドしたバイナリファイルをアップロードすることでこのリスクを小さくすることが出来ます。

以下はpy-spy-kwの例ですが、3つのファイルをアップロードしています。上2つがWheelファイルで、上がlinux用、下がwindows用にコンパイルされています(いずれも64bit用でpythonのバージョンは問わない)。pip installの際、pipはクライアントのOSをチェックして適切なファイル名称のWheelファイルか、又はなければソースファイルをダウンロードするという仕組みです。
コンパイルするのは当然アップロードする側なので、これをしようとするとクロスコンパイルの技術が必要になります。また、ファイル名も適切に設定する必要があります。

アップロード

まず、以下のコマンドでアップロードファイルを作成します。

python setup.py sdist #ソースファイルでアップロードする場合
python setup.py bdist_wheel #バイナリファイルをアップロードする場合

これによりdistフォルダが作成され、その中にアップロードするファイルが入っているはずです。ただし、この状態でアップロードしてもエラーが出る場合があるので、何か問題がないか以下コマンドで事前にチェックしておくことをお勧めします。

twine check dist/*

上記コマンドでPASSが出たファイルはOK、ERRORが出たファイルはその内容をもとに再調整し、すべてがPASSするようにしましょう。以下は私の例ですが、2つのwhlファイルが両方ともPASSEDになっていることが分かります(PASSED, with warningはOKということのようです)。

ここまで出来たらアップロードコマンドを打ちます。うまくいかなかったらsetup.pyか、.pypircファイルのどちらかに問題があるのだと思います。

twine upload --repository testpypi dist/*

アップロードがうまくいったらページを確認し、画面表示やアップロードファイルが正しく登録されているか確認しましょう。また、ページにpip installのコマンドが書かれているはずなので、これを自分の保有する環境で試して、想定通りに動くか確認しましょう。

PyPIへのアップロードと検証

Test PyPIでうまく動作しているので、以下コマンドで問題なく登録できるはずです。

twine upload --repository pypi dist/*

終わりに

かなり苦戦しましたが、なんとかPyPIに自作パッケージを登録することが出来ました。pipで登録できると、使ってもらえる頻度が増えるかもしれませんし、使いこなしていきたいと思います。なお、今回はプロジェクトをフォークしていているのですが、フォーク元にsetup.pyがあったため作成を省略できているので、この内容についても確認していく予定です。

以下のサイト様の情報を活用させていただきました。
https://blog.chocolapod.net/momokan/entry/117
https://qiita.com/shinichi-takii/items/e90dcf7550ef13b047b5
https://qiita.com/kinpira/items/0a4e7c78fc5dd28bd695
https://pod.hatenablog.com/entry/2019/06/12/092708?utm_source=feed
https://qiita.com/toshihikoyanase/items/9385cb1c11675e9661f1

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA