現在地: ホーム Dive Into Python 3

難易度: ♦♦♦♦♢

Pythonライブラリをパッケージ化する

恥は痛みと同じようなもの。どちらも一度しか感じない。
— メルトイユ侯爵夫人、危険な関係

 

飛び込む

真のアーティストは出荷する — スティーブ・ジョブズはそんなことを言っている。Pythonのスクリプト、ライブラリ、フレームワーク、アプリケーションをリリースしたいだって? 素晴らしい。世界はより多くのPythonコードを求めている。Python 3にはDistutilsと呼ばれるパッケージング用のフレームワークが付属している。このDistutilsはたくさんのものがつまったライブラリだ — (あなたのための)ビルドツール、(ユーザのための)インストールツール、(検索エンジンのための)パッケージのメタデータの形式、などなど。さらに、Distutilsは、オープンソースのPythonライブラリのための中央リポジトリである Python Package Index (“PyPI”) に統合されている。

このようなDistutilsの様々な面の中核にあるのが「セットアップスクリプト」だ(このスクリプトは伝統的にsetup.pyと呼ばれている)。実際、既に本書の中で何度かDistutilsセットアップスクリプトを目にしている。HTTPウェブサービスの章ではhttplib2をインストールするためにDistutilsを使用したし、ケーススタディ: chardetをPython 3へ移植するの章でchardetをインストールするときにも利用した。

この章では、chardethttplib2のセットアップスクリプトがどのような仕組みで動いているのかを説明するが、その解説はそのままPythonソフトウェアをリリースするための手引きになっている。

# chardetのsetup.py
from distutils.core import setup
setup(
    name = "chardet",
    packages = ["chardet"],
    version = "1.0.2",
    description = "Universal encoding detector",
    author = "Mark Pilgrim",
    author_email = "mark@diveintomark.org",
    url = "http://chardet.feedparser.org/",
    download_url = "http://chardet.feedparser.org/download/python3-chardet-1.0.1.tgz",
    keywords = ["encoding", "i18n", "xml"],
    classifiers = [
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Development Status :: 4 - Beta",
        "Environment :: Other Environment",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
        "Operating System :: OS Independent",
        "Topic :: Software Development :: Libraries :: Python Modules",
        "Topic :: Text Processing :: Linguistic",
        ],
    long_description = """\
Universal character encoding detector
-------------------------------------

Detects
 - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
 - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
 - EUC-JP, SHIFT_JIS, ISO-2022-JP (Japanese)
 - EUC-KR, ISO-2022-KR (Korean)
 - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
 - ISO-8859-2, windows-1250 (Hungarian)
 - ISO-8859-5, windows-1251 (Bulgarian)
 - windows-1252 (English)
 - ISO-8859-7, windows-1253 (Greek)
 - ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
 - TIS-620 (Thai)

This version requires Python 3 or later; a Python 2 version is available separately.
"""
)

chardethttplib2はオープンソースだが、Pythonライブラリを何か特定のライセンスでリリースしなければならないという制約は存在しない。この章で説明する手順は、ライセンスに関係なく、どんなPythonのソフトウェアにも使える。

Distutilsがやってくれないこと

初めてのPythonパッケージをリリースする作業は手ごわいものだ(2つ目は少し簡単になる)。Distutilsはできる限りの自動化を試みてくれるが、自分自身でやらなければいけないこともいくつか存在する。

ディレクトリ構造

Pythonソフトウェアのパッケージ化を始めるには、ファイルとディレクトリを整理する必要がある。httplib2ディレクトリは以下のようになる:

httplib2/                 
|
+--README.txt             
|
+--setup.py               
|
+--httplib2/              
   |
   +--__init__.py
   |
   +--iri2uri.py
  1. すべてのディレクトリとファイルを入れるルートディレクトリを作ろう。これにはPythonモジュールと同じ名前を付けておく。
  2. Windowsユーザのために、“read me” ファイルには.txtという拡張子を付け、さらにWindowsスタイルの改行文字を使っておこう。自分はコマンドラインから起動する独自のマクロ言語を備えたクールなテキストエディタを使っているからといって、ユーザーの人生を難しくする必要はない(ユーザは「メモ帳」を使っている。悲しいけれどこれは事実だ)。あなたがLinuxやMac OS Xを使っているとしても、そのクールなテキストエディタには、まず間違いなくファイルをWindowsスタイルの改行文字で保存するオプションがある。
  3. 何かもっともな理由がない限り、Distutilsのセットアップスクリプトにはsetup.pyという名前を付けておくべきだ。そして、おそらく「もっともな理由」など無いだろう。
  4. Pythonソフトウェアが単一の.pyファイルで構成されているのであれば、そのファイルは“read me”ファイルやセットアップスクリプトと一緒にルートディレクトリに置いておけばいい。しかし、httplib2は単一の.pyファイルではない。httplib2マルチファイルモジュールなのだ。しかしそれでも問題はない! ルートディレクトリの中にhttplib2ディレクトリを置こう。つまり、httplib2/というルートディレクトリの中にあるhttplib2/ディレクトリの中に__init__.pyファイルがあることになる。これで問題ない。実は、これによってパッケージ化の処理が単純化されるのだ。

chardetディレクトリの方はこれとは微妙に異なっている。httplib2と同じくchardetマルチファイルモジュールなので、chardet/というルートディレクトリの中にchardet/ディレクトリが存在する。しかし、chardetの場合は、README.txtファイルに加えてHTML形式のドキュメントがdocs/ディレクトリの中に用意されているのだ。このdocs/ディレクトリには、.htmlファイルや.cssファイルがいくつか入っており、さらにimages/というサブディレクトリの中には複数の.pngファイルや.gifファイルも入っている(これは後で重要になる)。また、(L)GPLでライセンスされたソフトウェアの慣例として、LGPLの全文を収めたCOPYING.txtというファイルも入っている。


chardet/
|
+--COPYING.txt
|
+--setup.py
|
+--README.txt
|
+--docs/
|  |
|  +--index.html
|  |
|  +--usage.html
|  |
|  +--images/ ...
|
+--chardet/
   |
   +--__init__.py
   |
   +--big5freq.py
   |
   +--...

セットアップスクリプトを書く

DistutilsのセットアップスクリプトはPythonスクリプトだ。このスクリプトは理論的にはPythonができることなら何でもできる。しかし実際には、このスクリプトでは最小限の処理を可能な限り標準的な方法で行うべきだ。セットアップスクリプトは退屈なものであるべきなのだ。インストール処理をエキゾチックなものにすれば、エキゾチックなバグレポートが返ってくることになるだろう。

どんなDistutilsセットアップスクリプトだろうと、1行目は常に同じものになる:

from distutils.core import setup

これはsetup()関数をインポートしている。この関数がDistutilsのメインのエントリポイントだ。すべてのDistutilsセットアップスクリプトのうちの95%はsetup()の呼び出しだけで構成されており、他には何も含んでいない(この統計は単なるでっち上げだが、Distutilsのセットアップスクリプトが、Distutilsのsetup()関数を呼び出す以上のことをするのであれば、何かそれ相応の理由を持っているべきだ。そんな理由を持っているだろうか? 私はそう思わなかった)。

setup()関数は何十ものパラメータを受け取ることができる。これに関わるすべての人を正気に保つために、すべてのパラメータには名前付き引数を使わなければならない。これは単なる慣例ではなく、コード上要求されている条件だ。従って、名前付き引数を使わずにsetup()関数を呼び出そうとすると、セットアップスクリプトはクラッシュする。

次の名前付き引数は必須だ:

必須ではないが、以下もセットアップスクリプトに含めておくことを推奨する:

セットアップスクリプトのメタデータはPEP 314で定義されている。

では、chardetのセットアップスクリプトを見てみよう。ここでは先ほど説明した必須/推奨のパラメーター全部に加えて、さらにもう一つ、まだ言及していなかったpackagesというパラメータを使っている。

from distutils.core import setup
setup(
    name = 'chardet',
    packages = ['chardet'],
    version = '1.0.2',
    description = 'Universal encoding detector',
    author='Mark Pilgrim',
    ...
)

packagesパラメータは、配布プロセスにおける用語の不幸な重複を浮き彫りにする。私たちは、いま構築しているものを「パッケージ」と呼んできた(そして、これがPythonの「パッケージ」インデックスに登録されるわけだ)。しかし、このpackagesパラメータが指しているものはそれとは違う。これは、chardetモジュールがマルチファイルモジュール(これは時に……「パッケージ」と呼ばれる)であるという事実を指しているのだ。このpackagesパラメータは、chardet/ディレクトリ、__init__.pyファイル、そしてchardetモジュールを構成するすべての.pyファイルをビルドに加えるようにDistutilsに伝える。これは重要だ。もし実際のソースコードを入れ忘れてしまったら、ドキュメントやメタデータの話はすべて無意味なものになってしまうからだ。

パッケージを分類する

Python Package Index (“PyPI”) には何千ものPythonライブラリが存在している。適切な分類用メタデータを用意しておけば、他の人々があなたのライブラリを簡単に見つけられるようになるだろう。PyPIは、分類タグをもとにパッケージを探せるようになっていて、分類タグをいくつか選んで絞り込みをかけることもできる。分類タグは無視できるような見えないメタデータではないのだ!

ソフトウェアを分類するには、classifiersパラメータをDistutilsのsetup()関数に渡せばよい。classifiersは文字列のリストだが、この文字列は自由形式ではない。すべての分類タグはPyPIのこのリストにあるものを使う必要がある。

分類タグはオプションなので、Distutilsのセットアップスクリプトを書く時には全て省略することもできる。しかしそれをやってはいけない。少なくとも次の分類タグは必ず入れておくべきだ。

以下の分類タグも含めておくことを奨める:

良いパッケージ分類タグの例

例を挙げるために、ここにDjangoの分類タグを示す。Djangoは、製品レベルの品質を持ち、クラスプラットフォームで、Webサーバ上で動作する、BSDライセンスのウェブアプリケーションフレームワークだ(DjangoはまだPython 3に対応していないので、Programming Language :: Python :: 3というタグは含まれていない)。

Programming Language :: Python
License :: OSI Approved :: BSD License
Operating System :: OS Independent
Development Status :: 5 - Production/Stable
Environment :: Web Environment
Framework :: Django
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: Dynamic Content
Topic :: Internet :: WWW/HTTP :: WSGI
Topic :: Software Development :: Libraries :: Python Modules

次はchardetの分類タグだ。chardetは、ケーススタディ: chardetをPython 3に移植するの章で取り上げている、文字コード自動判定用のライブラリだ。これはベータ版の品質で、クラスプラットフォームで、Python 3互換で、LGPLでライセンスされていて、開発者が自身の製品に組み込んで使うことを想定している。

Programming Language :: Python
Programming Language :: Python :: 3
License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
Operating System :: OS Independent
Development Status :: 4 - Beta
Environment :: Other Environment
Intended Audience :: Developers
Topic :: Text Processing :: Linguistic
Topic :: Software Development :: Libraries :: Python Modules

そして、次はhttplib2の分類タグだ。これは、HTTPウェブサービスで詳しく見たライブラリだ。httplib2はベータ版の品質で、クロスプラットフォームで、MITライセンスで、Python開発者を対象としている。

Programming Language :: Python
Programming Language :: Python :: 3
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Development Status :: 4 - Beta
Environment :: Web Environment
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Software Development :: Libraries :: Python Modules

マニフェストを使って追加ファイルを指定する

デフォルトでは、Distutilsは次のファイルをリリースパッケージに入れる:

これでhttplib2プロジェクトのファイルは網羅できている。しかしchardetプロジェクトでは、これに加えてCOPYING.txtライセンスファイルと、画像やHTMLファイルを収めたdocs/ディレクトリもパッケージに入れておくつもりだった。このファイルやディレクトリをchardetのリリースパッケージに追加してもらうには、マニフェストファイルが必要となる。

マニフェストファイルはMANIFEST.inという名のテキストファイルだ。このファイルをREADME.txtsetup.pyファイルと一緒にルートディレクトリに置こう。マニフェストファイルは、Pythonスクリプトではなく、Distutilsが定義する一連の「コマンド」を並べたテキストファイルだ。マニフェストコマンドを使うことで、特定のファイルやディレクトリをパッケージに含めたり除外したりできる。

これはchardetプロジェクト用のマニフェストファイル全体だ:

include COPYING.txt                                
recursive-include docs *.html *.css *.png *.gif    
  1. 1行目はそのままの意味だ。このコマンドはプロジェクトのルートディレクトリにあるCOPYING.txtファイルをパッケージに追加する。
  2. 2行目はもうすこし複雑だ。recursive-includeはディレクトリ名と1つ以上のファイル名を受け取る。このファイル名の部分ではファイルを個別に指定するだけではなく、ワイルドカードを使って指定することもできる。この行は「ルートディレクトリの中にdocs/ディレクトリがあるだろう? その中から.html.css.png.gifファイルを(再帰的に)探してほしい。それらをすべてリリースパッケージに入れたいんだ」という意味だ。

すべてのマニフェストコマンドは、プロジェクトディレクトリのディレクトリ構造をそのまま維持する。recursive-includeコマンドが.html.pngファイルをリリースパッケージのルートディレクトリに置くことはない。このコマンドはdocs/ディレクトリの構造を保ちつつ、このディレクトリの中にあるファイルのうちワイルドカードにマッチしたものだけをパッケージに含める(今まで言っていなかったが、chardetのドキュメントは、実際にはXMLで書かれており、別のスクリプトによってHTMLに変換されている。私はこのXMLファイルをリリースパッケージに含めずに、HTMLと画像だけを含めておきたいのだ)。

マニフェストファイルの形式は独自のものだ。詳しくは、Specifying the files to distributeと、the manifest template commandsを見てほしい。

繰り返すが、マニフェストファイルが必要になるのは、Distutilsがデフォルトでは無視するファイルをパッケージに入れる場合だけだ。マニフェストファイルが本当に必要なら、Distutilsがデフォルトで見つけないファイルやディレクトリだけを書くようにしよう。

セットアップスクリプトにエラーがないかを確認する

把握しておかなければいけないことはたくさんある。Distutilsには、必須なメタデータがセットアップスクリプト中にすべて存在しているかどうかをチェックするための組み込みの検証コマンドが付属している。例えば、versionパラメータを入れ忘れたとしたら、Distutilsがそれを思い出させてくれる。

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check
warning: check: missing required meta-data: version

versionパラメータ(とその他の必要なメタデータ全て)を入れると、checkコマンドはこのようになる:

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check

ソースディストリビューションを作る

Distutilsは、複数の種類のリリースパッケージを構築できる。最低でも、ソースコードと、Disturilsのセットアップスクリプトと、“read me”ファイルと、その他任意の追加ファイルを入れた「ソースディストリビューション」を構築すべきだ。ソースディストリビューションを構築するには、Distutilsのセットアップスクリプトにsdistコマンドを渡せばよい。

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py sdist
running sdist
running check
reading manifest template 'MANIFEST.in'
writing manifest file 'MANIFEST'
creating chardet-1.0.2
creating chardet-1.0.2\chardet
creating chardet-1.0.2\docs
creating chardet-1.0.2\docs\images
copying files to chardet-1.0.2...
copying COPYING -> chardet-1.0.2
copying README.txt -> chardet-1.0.2
copying setup.py -> chardet-1.0.2
copying chardet\__init__.py -> chardet-1.0.2\chardet
copying chardet\big5freq.py -> chardet-1.0.2\chardet
...
copying chardet\universaldetector.py -> chardet-1.0.2\chardet
copying chardet\utf8prober.py -> chardet-1.0.2\chardet
copying docs\faq.html -> chardet-1.0.2\docs
copying docs\history.html -> chardet-1.0.2\docs
copying docs\how-it-works.html -> chardet-1.0.2\docs
copying docs\index.html -> chardet-1.0.2\docs
copying docs\license.html -> chardet-1.0.2\docs
copying docs\supported-encodings.html -> chardet-1.0.2\docs
copying docs\usage.html -> chardet-1.0.2\docs
copying docs\images\caution.png -> chardet-1.0.2\docs\images
copying docs\images\important.png -> chardet-1.0.2\docs\images
copying docs\images\note.png -> chardet-1.0.2\docs\images
copying docs\images\permalink.gif -> chardet-1.0.2\docs\images
copying docs\images\tip.png -> chardet-1.0.2\docs\images
copying docs\images\warning.png -> chardet-1.0.2\docs\images
creating dist
creating 'dist\chardet-1.0.2.zip' and adding 'chardet-1.0.2' to it
adding 'chardet-1.0.2\COPYING'
adding 'chardet-1.0.2\PKG-INFO'
adding 'chardet-1.0.2\README.txt'
adding 'chardet-1.0.2\setup.py'
adding 'chardet-1.0.2\chardet\big5freq.py'
adding 'chardet-1.0.2\chardet\big5prober.py'
...
adding 'chardet-1.0.2\chardet\universaldetector.py'
adding 'chardet-1.0.2\chardet\utf8prober.py'
adding 'chardet-1.0.2\chardet\__init__.py'
adding 'chardet-1.0.2\docs\faq.html'
adding 'chardet-1.0.2\docs\history.html'
adding 'chardet-1.0.2\docs\how-it-works.html'
adding 'chardet-1.0.2\docs\index.html'
adding 'chardet-1.0.2\docs\license.html'
adding 'chardet-1.0.2\docs\supported-encodings.html'
adding 'chardet-1.0.2\docs\usage.html'
adding 'chardet-1.0.2\docs\images\caution.png'
adding 'chardet-1.0.2\docs\images\important.png'
adding 'chardet-1.0.2\docs\images\note.png'
adding 'chardet-1.0.2\docs\images\permalink.gif'
adding 'chardet-1.0.2\docs\images\tip.png'
adding 'chardet-1.0.2\docs\images\warning.png'
removing 'chardet-1.0.2' (and everything under it)

指摘しておきたいことがいくつかある:

c:\Users\pilgrim\chardet> dir dist
 Volume in drive C has no label.
 Volume Serial Number is DED5-B4F8

 Directory of c:\Users\pilgrim\chardet\dist

07/30/2009  06:29 PM    <DIR>          .
07/30/2009  06:29 PM    <DIR>          ..
07/30/2009  06:29 PM           206,440 chardet-1.0.2.zip
               1 File(s)        206,440 bytes
               2 Dir(s)  61,424,635,904 bytes free

グラフィカルインストーラを作る

私の考えでは、どんなPythonライブラリにもWindowsユーザのためのグラフィカルインストーラを付ける価値がある。このインストーラは(Windowsを使ってない人でも)簡単に作ることができるし、Windowsユーザはこれをありがたく思うだろう。

Distutilsを使えば、グラフィカルなWindowsインストーラを作成できる。この機能を使うにはbdist_wininstコマンドをDistutilsのセットアップスクリプトに渡せばよい。

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py bdist_wininst
running bdist_wininst
running build
running build_py
creating build
creating build\lib
creating build\lib\chardet
copying chardet\big5freq.py -> build\lib\chardet
copying chardet\big5prober.py -> build\lib\chardet
...
copying chardet\universaldetector.py -> build\lib\chardet
copying chardet\utf8prober.py -> build\lib\chardet
copying chardet\__init__.py -> build\lib\chardet
installing to build\bdist.win32\wininst
running install_lib
creating build\bdist.win32
creating build\bdist.win32\wininst
creating build\bdist.win32\wininst\PURELIB
creating build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\big5freq.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\big5prober.py -> build\bdist.win32\wininst\PURELIB\chardet
...
copying build\lib\chardet\universaldetector.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\utf8prober.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\__init__.py -> build\bdist.win32\wininst\PURELIB\chardet
running install_egg_info
Writing build\bdist.win32\wininst\PURELIB\chardet-1.0.2-py3.1.egg-info
creating 'c:\users\pilgrim\appdata\local\temp\tmp2f4h7e.zip' and adding '.' to it
adding 'PURELIB\chardet-1.0.2-py3.1.egg-info'
adding 'PURELIB\chardet\big5freq.py'
adding 'PURELIB\chardet\big5prober.py'
...
adding 'PURELIB\chardet\universaldetector.py'
adding 'PURELIB\chardet\utf8prober.py'
adding 'PURELIB\chardet\__init__.py'
removing 'build\bdist.win32\wininst' (and everything under it)
c:\Users\pilgrim\chardet> dir dist
c:\Users\pilgrim\chardet>dir dist
 Volume in drive C has no label.
 Volume Serial Number is AADE-E29F

 Directory of c:\Users\pilgrim\chardet\dist

07/30/2009  10:14 PM    <DIR>          .
07/30/2009  10:14 PM    <DIR>          ..
07/30/2009  10:14 PM           371,236 chardet-1.0.2.win32.exe
07/30/2009  06:29 PM           206,440 chardet-1.0.2.zip
               2 File(s)        577,676 bytes
               2 Dir(s)  61,424,070,656 bytes free

他のオペレーティングシステムのためのパッケージを構築する

Distutilsは、Linuxユーザ向けのインストールパッケージを構築する手助けをしてくれる。私の考えでは、これに時間をかける価値はおそらくない。Linuxでソフトウェアを配布してもらいたいなら、主要なLinuxディストリビューションでソフトウェアのパッケージ化を専門としているコミュニティメンバと協力したほうがいいだろう。

例として、私のchardetライブラリはDebian GNU/Linux リポジトリの中にある(従って、これはUbuntu リポジトリの中にもある)。私はこれに関して何もしていない。このパッケージはある日突然姿を現したのだ。DebianコミュニティはPythonライブラリをパッケージングする独自のポリシーを持っており、Debianのpython-chardetライブラリはこれらの慣習に従うように作られている。このパッケージはDebianのリポジトリの中に存続しているので、コンピュータの管理のために選択したシステムの設定にもよるがDebianのユーザはセキュリティアップデートや新しいバージョンを受け取ることになる。

Distutilsが構築するLinuxパッケージはこれらの利点を全く提供しない。時間は他のことに使ったほうが良い。

ソフトウェアをPython Package Indexに追加する

ソフトウェアをPython Package Indexにアップデートするプロセスには3つのステップがある。

  1. アカウントを作成する
  2. ソフトウェアを登録する
  3. setup.py sdistsetup.py bdist_*で作成したパッケージをアップロードする。

アカウントを作成するためにPyPI ユーザ登録ページへ行こう。希望のユーザ名、パスワード、有効な電子メールアドレスを入力し、Registerボタンをクリックしよう(PGPキーやGPGキーを提供することもできる。これらを持っていなかったり、これらの意味が分からなくても、心配は要らない)。PyPIから数分以内に、メールアドレスを検証するためのリンクが書かれている電子メールが届くはずなのでそれを確認してほしい。登録処理を完了させるためにそのリンクをクリックしよう。

今度は、ソフトウェアをPyPIに登録し、それをアップロードする必要がある。これは1つのステップですべて実行できる。

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload  
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]:  1                                                                 
Username: MarkPilgrim                                                                          
Password:
Registering chardet to http://pypi.python.org/pypi                                             
Server response (200): OK
running sdist                                                                                  
... output trimmed for brevity ...
running bdist_wininst                                                                          
... output trimmed for brevity ...
running upload                                                                                 
Submitting dist\chardet-1.0.2.zip to http://pypi.python.org/pypi
Server response (200): OK
Submitting dist\chardet-1.0.2.win32.exe 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 c:\home\.pypirc)
Save your login (y/N)?n                                                                        
  1. プロジェクトを初めてリリースするときは、DistutilsがソフトウェアをPython Package Indexに追加し、それに専用のURLを与える。それ以降の場合は、プロジェクトのメタデータを、変更されたsetup.pyのパラメータへと更新するだけだ。次に、ソースディストリビューションの構築 (sdist) と、Windowsインストーラの構築 (bdist_wininst) を行って、それらをPyPIにアップロードする (upload)。
  2. “use your existing login.” を選択するために、1と入力してENTERキーを押そう。
  3. PyPIユーザ登録ページで入力したユーザ名とパスワードを入力しよう。Distuilsは入力したパスワードをエコーしないし、文字の代わりにアスタリスクをエコーすることもない。パスワードを入力してENTERを押そう。
  4. DistutilsはパッケージをPython Package Indexに登録し……
  5. ……ソースディストリビューションを構築し……
  6. ……Windows用インストーラを構築し……
  7. ……そして、これら両方をPython Package Indexにアップロードする。
  8. もし新しいバージョンのリリース処理を自動化したいのであれば、PyPIの証明書をローカルファイルに保存しておく必要がある。これはまったくセキュアではないので、まったく任意だ。

おめでとう。Python Package Indexに自分のページを手に入れた! アドレスはhttp://pypi.python.org/pypi/NAMEだ(NAMEにはsetup.pyファイルのnameパラメータに渡した文字列が入る)。

新しいバージョンをリリースしたいときは、setup.pyを単に新しいバージョン番号で更新して、同じアップロードコマンドを再び実行しよう:

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload

Pythonのパッケージ化のありうる未来

Distutilsは、Pythonのパッケージ化のすべてだというわけではないが、これを書いている時点(2009年8月)において、Python 3で動作するパッケージングフレームワークはこれしかない。Python 2には他にも多くのフレームワークがあり、いくつかはインストールに焦点をあてているし、他のいくつかはテストやデプロイに焦点をあてている。このうち、いくつかは(あるいは全部が)将来的にはPython 3に移植されるかもしれない。

インストールに焦点をあてたフレームワーク:

テストやデプロイに焦点をあてたフレームワーク:

もっと知りたい人のために

Distutilsについて:

他のパッケージング用フレームワークについて:

© 2001– Mark Pilgrim
© Fukada, Fujimoto(日本語版)