PyPI に自作の Python Module を登録してみる

僕は Python って嫌いなんですが、PyFITS や PySerial だけは便利に使っています。特に PySerial に関しては、今さら C で termios とかを弄る元気はないので、実験室で電源や電圧計のような速度を重視しない装置を使う時には、PySerial で制御しています。

RS232C (もしくは USB to serial chip) の載っている装置を動かす時、自分の実験用に短期間だけ動かすだけであれば、PySerial を import して数行書くだけで済みます。しかし何年もその装置を使ったり、研究室の他の人間 (もしくは世界の誰か) も同じ装置を使いたい場合は、書き捨ての Python script を用意するよりは、ちゃんと module にして再利用可能にしておいたほうが色々と楽です。

Python では PyPI (Python Package Index) と呼ばれる Python package の配布用の場所が提供されています。ここに自作の module や package を登録してしまえば、同僚には「easy_install で落とせるから」と伝えるだけで万事うまく行きます。

今回は Good Will Instrument の GPD-3303S という DC 電源を制御するための module を例にします。

Module を書く

以下のように directory と 3 つの file を用意します。src/ という directory は必ずしも必要ありませんが、PyDEV を使っている場合は自動で作成されます。

PyGPD3303S/
PyGPD3303S/src/
PyGPD3303S/src/README
PyGPD3303S/src/setup.py
PyGPD3303S/src/gpd3303s.py

gpd3303s.py が module 本体で、この中には GPD3303S という class が書かれています。Module 自体は好きなように書けば良く、PyPI への登録には直接関係ありません。

通常、setup.py は PyPI に登録しない場合でも Python module や package を作る場合には用意します。しかし PyPI に登録する場合には、世の中の誰が使うか分からない場所に公開するので、ある程度ちゃんとした記述をするように気をつけたほうが良いでしょう。

書いた Module は sourceforge かどこかで管理しよう

上記の file は、自分の HDD のみで保存しておいても仕方がないので、sourceforge なりどこかで、ちゃんと version 管理をしておきましょう。今回はここSubversion で管理しています。

PyPI で user 登録する

ここPyPI を使うための user 登録を済ませます。

setup.py をちゃんと書く

「ちゃんと」と言っても自分も初めてで詳しくないのですが、以下のような情報を記載しましょう。

from distutils.core import setup
import gpd3303s

setup(name='PyGPD3303S',
      version='1.0.1',
      description='Python Interface for DC power supply GPD-3303S',
      author='Akira Okumura',
      author_email='oxon@mac.com',
      license='BSD License',
      platforms=['MacOS :: MacOS X', 'POSIX', 'Windows'],
      url='https://sourceforge.net/p/pygpd3303s/',
      py_modules=['gpd3303s'],
      install_requires=['pyserial'],
      classifiers=['Topic :: Terminals :: Serial',
                   'Development Status :: 4 - Beta',
                   'Programming Language :: Python',
                   ],
      long_description=gpd3303s.__doc__
      )

'version' は、PyPI に upload する度にちゃんと数字が増えてないといけません。同じ番号で何度も upload できないので、upload する場合は番号をちゃんと更新します。

'description' や 'author' といった項目は、当たり前ですがちゃんと書きましょう。'license' はご自由に。

'url' は、今回の場合 sourceforge に登録しておいたので、その URL を書けば問題ありません。

この PyGPD3303S という module は、PySerial の使用が前提となっています。そのため、PyGPD3303S だけを install しても動作しませんし、import でこけます。'install_requires' のところに PySerial の情報を書いておけば、easy_install などで PyGPD3303S を install するときに、自動的に PySerial も install してくれます。

classifires の書き方は ここ を参考にして決めます。

PyPI に upload する

PyGPD3303S/src/ に移動し、次の command を実行します。

$ python setup.py register sdist upload

これで、(恐らく OS X 以外は) うまく upload できるはずです。今回、僕は OS X 環境でやったためか、この upload に失敗しました。

$ python setup.py register sdist upload
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py:266: UserWarning: Unknown distribution option: 'install_requires'
  warnings.warn(msg)
running register
We need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]:  
Username: oxon
Password: 
Registering PyGPD3303S to http://pypi.python.org/pypi
Server response (200): OK
I can store your PyPI login so future submissions will be faster.
(the login will be stored in /Users/oxon/.pypirc)
Save your login (y/N)?y
running sdist
reading manifest file 'MANIFEST'
creating PyGPD3303S-1.0.1
making hard links in PyGPD3303S-1.0.1...
hard linking gpd3303s.py -> PyGPD3303S-1.0.1
hard linking setup.py -> PyGPD3303S-1.0.1
tar -cf dist/PyGPD3303S-1.0.1.tar PyGPD3303S-1.0.1
gzip -f9 dist/PyGPD3303S-1.0.1.tar
removing 'PyGPD3303S-1.0.1' (and everything under it)
running upload
Submitting dist/PyGPD3303S-1.0.1.tar.gz to http://pypi.python.org/pypi
Upload failed (401): You must be identified to edit package information

" 1. use your existing login," を選択し、username と password を入力し、/Users/oxon/.pypirc に情報を保存するかと聞かれるので y で答えます。しかし、正しい username と password を入れても一番最後で認証に失敗します。N で回答しても失敗します。

/Users/oxon/.pypirc はこのような中身で保存されています*1

[pypirc]
servers =
    pypi

[pypi]
username:oxon
password:MY_PASSWORD_IS_HERE

これを、次のように書き換えましょう。

[pypirc]
servers =
    pypi

[server-login]
username:oxon
password:MY_PASSWORD_IS_HERE

この状態で再び同じ command を実行すると、無事に PyPI に自作の module が登録されるはずです。

$ python setup.py register sdist upload

自分の module を install する

最後に、作成した module を install したい環境で、以下の command を実行します。PySerial と一緒に、自動的に install 作業が進むはずです。

$ sudo easy_install pygpd3303s

同僚のマシンに install する際も、Subversion で落としてもらったりとか、source code を渡してあげたりする必要はありません。「easy_install で入れてね」と言えば一発です。

.pypirc を削除する

/Users/oxon/.pypirc にはベタ書きで password が保存されてしまいますので、一連の作業が終わったら削除しておきましょう。


*1:当然ですが、password は実際に入力したものがベタ書き保存されています