PyPIにライブラリを登録したときのメモ

PyPIとは

なんぞ?と訊かれたらPythonCPANと答えてる。CPANがどんなものであったのかはもう記憶の彼方だが。
ユーザー登録だけ済ませれば、後はコマンド一発で新規登録から更新までこなしてくれる。
こんな便利なものをついこの間まで知らなかった。…人生の損失だと思う。少なくとも時間は確実に損してる。

setup.pyを書く

from setuptools import setup, find_packages
setup(
    name    = "hoge", #名前
    version = "1.0",  #バージョン
    description      = "PyPIで一覧に表示されるコメント",
    long_description = "パッケージのページで表示されるコメント",
    
    packages = find_packages(), #パッケージを自動検出
    
    url          = 'http:// ... ',  #URL
    author       = 'foouser',       #作者
    author_email = 'foouser@ ... ', #メールアドレス
)

基本的にはこんな感じで。
これをライブラリの一つ上の階層に置いておく。

とりあえず動作を確認

setup.py sdist bdist_egg

これで作成されたアーカイブを開いてみたりインストールして動作を確認してみたりする。

ライブラリを登録するには

setup.py register sdist bdist_egg upload

とすれば自動的に処理が始まる。
この際、ユーザー名とパスワードを聞かれるので入力する。

windowsのPython2.5.2などで失敗するときは

http://mail.python.org/pipermail/python-bugs-list/2008-January/044636.html
のあたりを参考に、register.py upload.pyを修正する。

site-packages直下にスクリプトをインストールしたい

# fooscript.py hogehoge

のようにコンソールから使いたいスクリプトがあるなら、setup.pyに

setup(

    ...

    scripts = ['libname/fooscript.py'],

を加える。

ライブラリに含めるファイルを詳しく指定する

__init__.pyが存在しないディレクトリ内のファイルなどは、標準ではライブラリに含まれない。
例えば libname/html_files があり、これをライブラリに含めたいなら、
setup.pyと同一ディレクトリにMANIFEST.inを作成し、

recursive-include libname/html_files *

などとして、setup.pyは

data_files = []
for path, dirs, files in os.walk('libname'):
    #windowsなら
    #path = path.replace('\\', '/')
    data_files.append([path, ['%s/%s' % (path, f) for f in files]])

...

setup(

    ...

    packages = find_packages(),
    data_files = data_files, #これを追加

のように。
指定したファイルをアップロードするアーカイブに含め、かつインストールも行うならこのようにする必要がある。

PyPIに詳しい情報を登録する

setup(
    ...

    license   = 'MIT',   #ライセンス
    platforms = ['Any'], #プラットフォーム
    #タグ情報
    classifiers = ['Development Status :: 4 - Beta',
                   'Environment :: Console',
                   'License :: OSI Approved :: MIT License',
                   'Operating System :: OS Independent',

                   ...

                   ],

のように。
classifiersは一度アップロードした後、設定ページのソースを見てコピペすると楽。