PyPIにパッケージ登録する

  • 79
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

初めてPyPIにパッケージを登録したので、やったことをまとめておく。

setup.pyできるようにする

ディレクトリ構造はこれ以上ないぐらい簡単。

.
├── LICENSE.txt
├── README.md
├── nbupload
│   ├── FileUploaderView.js
│   ├── FileUploaderWidget.py
│   └── __init__.py
└── setup.py

git管理するのでPython用.gitignoreも入れておく。

最低限のsetup.pyを書く。packages=['nbupload']というのが、ディレクトリ名をパッケージにする書き方。詳しくはドキュメントを参照。

from setuptools import setup

setup(
    name = "nbupload",
    version = "0.0.1",
    packages=['nbupload'],
)

これで、

python setup.py develop

と打つと、develop用にインストールされ、普通にimportすることができる。実体としては、pythonのsite-packagesディレクトリにnbupload.egg-linkというファイルがあり、この中にパッケージのディレクトリへのパスが書いてあった。

アンインストールするには

python setup.py develop -u

でよい。

pypiに登録する

setup.pyは上のだと寂しいのでいろいろ追加する

pypiのアカウントが無い場合はアカウントを取得する。パッケージ登録テスト用のtestpypiというのもあるので、そちらにも同様の手順でアカウント登録する。登録するパスワードはプレーンテキストでホームディレクトリに置く必要がある(すぐ消してもいいけど)ので注意。

パスワードは16文字以上で大文字小文字数字が無いとダメだった気がする。GoogleのOpenIDはGoogleが新規登録をサポートしなくなったので使えない。

ホームディレクトリに.pypircを作る。(pypiにだけ登録するのであればこれを置かなくても良いっぽい(?)けど、testpypiがあるとこれを置かないといけない)

ここを参考にした。

[distutils]
index-servers =
    pypi
    pypitest

[pypi]
repository: https://pypi.python.org/pypi
username: {{your_username}}
password: {{your_password}}

[pypitest]
repository: https://testpypi.python.org/pypi
username: {{your_username}}
password: {{your_password}}

testpypiに登録。

python setup.py register -r https://testpypi.python.org/pypi

これでpypiに項目ができ、pip search --index https://testpypi.python.org/pypi nbuploadでも出るようになる。

ただ、このままだとまだどこにもパッケージの実体が無い状態なので、gzipをアップロードしないといけない。setup.pyにdownload_urlと書いてgithubのtagのgzipを指定することもできるが、デフォルトではpip installはpypi以外のURLを無視するので(--allow-externalをつければ通る)、pypi自体にアップロードするのが良い。それをするのが次のコマンド。

python setup.py sdist upload -r https://testpypi.python.org/pypi

これでpip install --index-url https://testpypi.python.org/simple/ nbuploadでインストールできるようになる。

ここまでできればあとは本番pypiに登録するだけ。

python setup.py register
python setup.py sdist upload

で終了。

おまけ: python以外のファイルをパッケージに含める

今回はJSをパッケージに含めて配布する必要があるため、setup.pyにこう書かないといけなかった。

    package_data = {
        'nbupload': ['FileUploaderView.js'],
    },

これをしないと、デフォルトではpython setup.py sdist uploadでパッケージングするときにpython以外のファイルが含まれない。