このブログを検索

第16章 Pythonライブラリをパッケージする

難易度: ♦♦♦♦♢

16.1. 没頭しよう


真のアーティストの船出です。スティーブ・ジョブズがこう言ったとか。『Pythonスクリプト、ライブラリ、フレームワーク、アプリケーションをリリースしたいかい?』いいでしょう。世界はより多くのPythonコードを必要としているのです。Python3にはDistutilsというパッケージフレームワークがあります。Distutilsにはいろいろな機能があります―ビルドツール(あなた向け)、インストールツール(ユーザ向け)、パッケージ・メタデータフォーマット(サーチエンジン向け)などです。Pythonオープンソースライブラリの中心リポジトリであるPython Package Index ("PyPI")に集められています。

Distutilsのこれらの機能はすべて、伝統的にsetup.pyと呼ばれるセットアップスクリプトに集められています。実は、この本の中ですでにDistutilsセットアップスクリプトは何度か出てきています。HTTP Web Servicesの章でhttplib2をインストールするためにDistutilsを使いましたし、Case Study Porting chardet to Python 3の中でもchardetをインストールするために使いました。

この章では、chardetやhttplib2のセットアップスクリプトがどのように動作するかを知り、自分のPythonソフトウェアをリリースするプロセスを段階的に学びます。
# chardet's 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.
"""
)
👉 chardetとhttp2はオープンソースですが、特定のライセンスの下でPythonライブラリをリリースすることを要求しています。この章で出てくるものは、ライセンスに関わらずどんなPythonソフトウェアに対しても有効です。

16.2. Distutilsがやってくれないこと

オリジナルのPythonパッケージをはじめてリリースするのは骨の折れることです(2番目のパッケージはいくらか簡単になります。) Distutilsはできる限り自動化されていますが、自分でやらなければならないこともあります。
  • ライセンスを選びましょう これは複雑なトピックで、政治的要素や危険を伴います。あなたがオープンソースとして自分のソフトウェアをリリースしたいのであれば、謹んでこのアドバイスを贈ります。
  1. 自分でライセンスを書いてはいけません。
  2. 自分でライセンスを書いてはいけません。
  3. 自分でライセンスを書いてはいけません。
  4. GPLである必要はありませんが、GPL互換である必要があります。
  5. 自分でライセンスを書いてはいけません。
  • PyPIクラス化システムを使ってソフトウェアをクラス化しましょう これに関しては次の章で説明します。
  • "read me"ファイルを書きましょう これを省略してはいけません。少なくとも、ユーザにソフトウェアの概要とインストール方法を伝えましょう。

16.3. ディレクトリ構造

Pythonソフトウェアのパッケージ化を開始するときは、ファイルとディレクトリを順番に並べる必要があります。

httplib2ディレクトリはこのようになっています。

httplib2/                 # ①
|
+--README.txt             # ②
|
+--setup.py               # ③
|
+--httplib2/              # ④
   |
   +--__init__.py
   |
   +--iri2uri.py
①すべてを含むrootディレクトリを作ります。ディレクトリ名はこれから作るPythonモジュールと同じにします。

②Windowsユーザのために、"read me"ファイルに.txt拡張子をつけ、Windows形式の改行を使いましょう。たとえあなたがコマンドラインから実行する便利なテキストエディタを使っていて、それが独自のマクロを含んでいたとしても、ユーザの人生を困難にする理由にはなりません(ユーザはNotepadを使っています。悲しいけど本当です) 。LinuxやMac OSXを使っていても、便利なテキストエディタにはファイルを保存するときにWindows形式の改行を使うオプションが必ずあります。

③よほどの理由がない限り、Distutilsセットアップスクリプトの名前はsetup.pyとするべきです。

④Pythonソフトウェアが1つの.pyファイルであるならば、それを"read me"ファイルとセットアップスクリプトと一緒にルートディレクトリに入れます。httplib2は、.pyファイル1つではなく、複数ファイルのモジュールです。それでも大丈夫です! httplib2ディレクトリをルートディレクトリに入れましょう。そうすると、__init__.pyファイルがルートhttplib2/の中のhttplib2/ディレクトリに入っています。これは特に問題ではありません。単にパッケージ化の過程です。

chardetディレクトリは少し違っています。httplib2のと同様に複数ファイルのモジュールですが、chardet/ディレクトリがchardet/ルートディレクトリの中にあります。README.txtファイルに加えて、chardetはhtml形式のドキュメントがdocs/ディレクトリの中にあります。docs/ディレクトリにはいくつかの.html、.cssファイルがあり、さらにimages/サブディレクトリがあって中には.png、.gifが入っています(これは後で重要になります。)さらに、(L)GPLライセンスの慣習に従って、COPYING.txtというLPGLのテキスト全文を含んだファイルが個別に入っています。
chardet/
|
+--COPYING.txt
|
+--setup.py
|
+--README.txt
|
+--docs/
|  |
|  +--index.html
|  |
|  +--usage.html
|  |
|  +--images/ ...
|
+--chardet/
   |
   +--__init__.py
   |
   +--big5freq.py
   |
   +--...

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

DistutiisセットアップスクリプトはPythonスクリプトですから、Pythonでできることは理論上は何でもできます。実用上は、可能な限り標準的な方法で最低限のことができれば問題ありません。セットアップスクリプトは退屈なものです。インストールのプロセスが規格外であればあるほど、バグ報告も規格外になっていきます。

どんなDistutilsセットアップスクリプトでも、最初の1行は同じです。
from distutils.core import setup
こうすることでDistutiisのメイン入り口であるsetup()関数がインポートされます。95%のDistutilsセットアップスクリプトは、setup()を呼び出すだけであとは何もしません(この統計はでっち上げですが、もしDistutilsセットアップスクリプトがDistutils.setup()関数を呼び出す以上のことをしていれば、相応の理由があるはずです。今、何か理由がありますか?わたしはそうは思いませんでした)。

setup()関数は多くのパラメータを受け取ります。関わるすべての人の正気を保つためには、すべてのパラメータを名前付きの引数にしなくてはなりません。これは単なる習慣ではなく、強い要求です。setup()関数を名前なしの引数で呼び出そうとすると、セットアップスクリプトはクラッシュしてしまいます。

これらの名前付き引数が必須となります。
  • name パッケージの名前
  • version パッケージのバージョン番号
  • author フルネーム
  • author_email emailアドレス
  • url プロジェクトのホームページ。個別のプロジェクトウェブサイトがなければ、PyPIパッケージのページでもかまいません。

以下のものは必須ではありませんが、セットアップスクリプトに含めることをおすすめします。
  • description プロジェクトの1行要約
  • long_description reStructuredTextフォーマットで複数行の文字列を書きます。PyPIはこれをhtmlに変換してパッケージページで表示します。
  • classifiers 分類子。特別にフォーマットされた文字列のリスト(次章で説明します)

👉セットアップスクリプトメタデータはPEP314で定義されています。

次にchardetのセットアップスクリプトを見ていきましょう。パラメータには必須のものと推奨のものがありますが、あと1つまだ説明していないものがあります。packagesです。
from distutils.core import setup
setup(
    name = 'chardet',
    packages = ['chardet'],
    version = '1.0.2',
    description = 'Universal encoding detector',
    author='Mark Pilgrim',
    ...
)
残念なことに、ハイライトしたpackagesパラメータは、ディストリビューションプロセスと単語が重複しています。今作っているもの(Python"Package"Indexにリストされる可能性があるもの)として"package"の話をしてきました。しかし、それはここでpackagesパラメータが指すものではありません。このパラメータの意味は、cahrdetモジュールが複数ファイルのモジュールである、ということです(そのことが"package"であるとされるときもあります)。packagesパラメータは、chardetディレクトリ、__init__.pyファイル、chardetモジュールを構成する他のすべての.pyファイルを含めることをDistutilsに伝えています。重要なことは、ドキュメントとメタデータに関するこの楽しい話はすべて、実際のコードをインクルードするのを忘れていれば関係ないということです!

16.5. パッケージを分類する

Python Package Index ("PyPI")には数千のPythonライブラリが含まれています。メタデータを適切に分類することによって、あなたのライブラリは人から見つかりやすくなるでしょう。PyPIでは、分類でパッケージを検索することができます。複数の分類を選んで検索範囲を絞ることもできます。分類は見えないメタデータだからといって無視できるものではないのです!

Distutilsのsetup()関数に分類パラメータを渡すと、ソフトウェアを分類することができます。分類パラメータは文字列のリストですが、これらの文字列は好きなようには書けません。すべての分類文字列はPyPlのリストから使います。

分類はオプションです。分類なしでDistutiisセットアップスクリプトを書くことも可能です。しかし、そうしてはいけません。少なくとも、必ずこれらの分類を含めるべきです。

  • プログラム言語 特に"Programming Language : : Python"と" Programing Language : : Python : : 3"はどちらも書いてください。 これらがないと、pypi.python.orgの全ページのサイドバーにリンクがあるPython3互換ライブラリのリストにあなたのパッケージが載りません。
  • ライセンス サードパーティのライブラリを使おうとするとき、わたしは間違いなく最初にここを見ます。この致命的な情報を捜索させないようにしてください。ソフトウェアが明確に複数ライセンス下にあるときを除いて、複数の分類を含めてはいけません(また、やむを得ないときを除いてソフトウェアを複数ライセンスでリリースしないように。他の人にもさせないようにしてください。ライセンスは、そもそも頭痛の種ですから、悪化させないようにしましょう)。
  • オペレーティングシステム もしソフトウェアがWindows上で(またはMac OS XやLinux上で)動くのであれば、できるだけ早くそれを知っておきたいのです。ソフトウェアのコードにプラットフォーム依存がなく、どの環境でも動くのであれば"Operating System :: OS Independent"という分類を使いましょう。複数のOS分類が必要になるのはソフトウェアが各プラットフォームからの特別なサポートを必須としているときだけです(通常では関係ありません)。
下記の分類も含めることをおすすめします。
  • 開発状況 ソフトウェアはベータ品質でしょうか?アルファ品質でしょうか?アルファ以前でしょうか?選んでください。正直に。
  • 対象とする人 このソフトウェアをダウンロードするのは誰でしょうか?よくある選択肢としては、Developers、 End Users/Desktop、Science/Research、System Administratorsがあります。
  • フレームワーク このソフトウェアがより大きなPythonフレームワーク、例えばDjangoやZopeのプラグインである場合は、適切なフレームワーク分類を入れましょう。そうでないときは、省略します。
  • トピック 膨大な選択肢からトピックを選ぶことができます。当てはまるものをすべて選びましょう。

16.5.1 よいパッケージ分類の例

例として、ここではDjangoの分類を見てみましょう。プロダクションレディで、プラットフォーム横断的、BSDライセンスのWebアプリケーションフレームワークでWebサーバ上で稼働します(DjangoはPython3の互換性はまだありませんから、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
cahrdetの分類も見てみましょう。chardetエンコーディング検知ライブラリはCase Study: Porting chardet to Python 3で扱いました。chardetはベータ品質、クロスプラットフォーム、Python3互換、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 Web Servicesの章で出てきました。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

16.6. マニフェストで追加ファイルを指定する

Distutilsはデフォルトのリリースパッケージに下記のファイルを含んでいます。
  • README.txt
  • setup.py
  • packageパラメータの中に書かれている複数ファイルモジュールで必要となる.pyファイル
  • py_modulesパラメータに書かれた個々の.pyファイル
これでhttplib2プロジェクトのファイルすべてをカバーします<link>。chardetプロジェクトの場合は、COPYING.txtライセンスファイル、すべての画像とhtmlファイルを合わせたドキュメントおよびディレクトリも含めたくなります。chardetリリースパッケージをビルドするときにDistutilsにこれらの追加ファイルとディレクトリを含めることを伝えるには、<i>マニフェストファイル</i>が必要です。

マニフェストファイルはMANIFEST.inというテキストファイルです。README.txtやsetup.pyの次にプロジェクトのルートディレクトリに置きます。マニフェストファイルはPythonスクリプトではなく、Distutilsで定義されたフォーマットの"コマンド"列が書かれたテキストファイルです。マニフェストコマンドによって、インクルード、エクスクルードするファイルやディレクトリを指定することができます。

こちらはchardetプロジェクトのマニフェストファイル全文です。
include COPYING.txt                                # ①
recursive-include docs *.html *.css *.png *.gif    ②
①1行目は読んだとおりです。プロジェクトのルートディレクトリからCOPYING.txtファイルをインクルードします。

②2行目はもう少し複雑です。recursive-inciudeコマンドはディレクトリ名と1つ以上のファイル名を受け取ります。ファイル名は特定のファイルに限定されず、ワイルドカードを入れることができます。この行が意味することは"このプロジェクトのルートディレクトリにdocs/ディレクトリがありますか?中にある.html、.css、png、.gifファイルを(回帰も含めて)調べてください"ということです。

すべてのマニフェストコマンドは、プロジェクトディレクトリ内で設定したディレクトリ構造を保存しています。このrecursive-includeコマンドは、.htmlとpngファイルをリリースパッケージのルートディレクトリに大量に置くことはありません。既存のdocs/ディレクトリを管理するのですが、ディレクトリにあるファイルの中でワイルドカードにマッチしたものだけを含めます(先に説明しませんでしたが、chardetドキュメントは実はXMLで書かれていて他のスクリプトによってHTMLに変換されています。リリースパッケージにインクルードするのはHTMLと画像ファイルだけにして、XMLファイルは除外したいのです)

👉マニフェストファイルには特有のフォーマットがあります。詳細はSpecifying the files to distributethe manifest template commandsを参照のこと。

繰り返すと: デフォルトではDistutilsに含まれないファイルをインクルードしたいときは、マニフェストファイルを作るだけでよいのです。マニフェストファイルが実際に必要なときは、Distutilsが自動では見つけなかったファイルとディレクトリだけをインクルードさせます。

16.7. エラーのためのセットアップスクリプトを確認する

注意しておくべきものは沢山あります。Distutilsにはビルトインの評価コマンドが備わっていて、セットアップスクリプトの中に必要なメタデータがすべて揃っているかどうか確認してくれます。例えば、versionパラメータを入れ忘れていた場合にも、Distutilsが教えてくれます。
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check
warning: check: missing required meta-data: version
versionパラメータを入れたあとは(そして他のすべての必須のメタデータ情報が入っていれば)、チェックコマンドはこのようになります。
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check

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

Distutilsではリリースパッケージを複数の形式でビルドすることをサポートしています。少なくとも"ソースディストリビューション"を作る必要がありますが、そこに入れるのはソースコード、Distutilsセットアップスクリプト、"read me"ファイル、その他に何か入れたい追加ファイルです。ソースディストリビューションを作成するには、sdistコマンドをDistutiisセットアップスクリプトに渡します。
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)
注目すべきことは:
  • Distutiisはマニフェストファイル(MANIFEST.in)を見つけました。
  • Distutilsはマニフェストファイルのパースに成功して、欲しかった追加ファイル、つまりdocs/ディレクトリのCOPYING.txt、html、画像ファイルを追加します。
  • プロジェクトのディレクトリをよく見ると、Distutilsがdist/ディレクトリを作成したことがわかります。dist/ディレクトリの中には配布用のzipファイルがあります。
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              .
07/30/2009  06:29 PM              ..
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

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

これは個人的な意見ですが、WindowsユーザのためにすべてのPythonライブラリはグラフィカルインストーラーを用意するべきです。(Windowsを使っていなくても)簡単に作れますし、Windowsユーザは喜ぶことでしょう。

Distutilsではbdist_wininstコマンドをDistutilsセットアップスクリプトに渡すことでグラフィカルなWindowsインストーラーを自分で作ることができます。
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              .
07/30/2009  10:14 PM              ..
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

16.9.1.他のOSでインストールできるパッケージを作る

DistutilsはLinuxユーザがインストールできるパッケージを作るのに役立ちます。私の考えでは、これにはあまり時間をかけるべきではありません。ソフトウェアをLinuxに対応させたいのであれば、ソフトウェアパッケージをメジャなLinuxディストリビューションに対応させるのを得意としているコミュニティのメンバーと一緒に作業すると、よりよい時間の使い方となるでしょう。

例えば、わたしが作ったchardetライブラリはDebianGNU/Linuxレポジトリにあります(Ubuntuレポジトリにもあります)。わたしはこれに何も関与していませんが、このパッケージは1日でここに出てきました。DebianコミュニティにはPythonライブラリのパッケージ化に関する独自ポリシーがあって、Debian python-chardetパッケージはこれらの慣習に従うように設計されています。パッケージがDebianリポジトリ内で生きているので、Debianユーザは、コンピュータ管理で選択したシステム設定に従ってセキュリティアップデートや新しいバージョンを受け取ることができます。

DistutilsがビルドするLinuxパッケージにはこのような利点が全くありません。他のことに時間を使いましょう。

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

ソフトウェアをPython Package Indexにアップロードする方法は3ステップです。
  1. アカウントを登録する
  2. ソフトウェアを登録する
  3. 作成したパッケージをsetup.py sdistとstup.py bdist_*とともにアップロードする

アカウントを登録するためには PyPIユーザ登録ページに行きます。希望のユーザ名とパスワードを入力して、有効なeメールアドレスを入力して、登録ボタンを押します(PGP、GPGキーを持っているならば、それも提示します。持っていない、または何かわからない場合は、気にしなくて構いません)。eメールをチェックすると、数分以内にPyPlから認証リンクの書かれたメッセージが届いているはずです。リンクをクリックして登録プロセスを完了します。

次にソフトウェアを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   
①プロジェクトをはじめてリリースすると、DistutiisはあなたのソフトウェアをPython Package Indexに追加して固有のURLを与えます。そのあとはsetup.pyパラメータの中で行ったどんな変更に対しても、プロジェクトのメタデータをアップデートするだけです。次に、ソースディストリビューション(sdist)とWindowsインストーラー(bdist_wininst)を作成してPyPIにアップロードします(upload)。

②1をタイプしてENTERを押し、"use your existing login"を選択します。

③PyPIユーザ登録ページで選択したユーザ名とパスワードを入力します。Distutilsはパスワードを表示しません。入力部分のアスタリスクも表示しないのです。気にせずパスワードを入力してENTERを押します。

④DistutiisはPython Package Indexにパッケージを登録して・・・

⑤ソースディストリビューションをビルドして・・・

⑥Windowsインストーラーをビルドして・・・

⑦両方をPython Package Indexにアップロードします。

⑧新しいバージョンのリリースを自動化したいのであれば、PyPIの資格情報をローカルファイルに保存する必要があります。これは間違いなく不安全なので、完全にオプションです。

おめでとうございます!これでPython Package Indexに自分のページができました。アドレスはhttp://pypi.python.org/pypi/NAMEで、NAMEはsetup.pyファイルに書いたname parameterの文字列です。

新しいバージョンをリリースしたいときは、setup.pyを新しいバージョン番号にアップデートして同じアップロードコマンドを再び実行するだけです。
c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload

16.11. Pythonパッケージの大きな可能性

DistutilsはPythonパッケージ化を最初から最後まですべて含んでいるわけではありませんが、これを書いている時点(2009年8月)では、Python3で使える唯一のパッケージフレームワークです。
Python2には他のフレームワークが沢山あります。インストールに特化したものや、テスト、開発に特化したものもあります。将来的にはすべてまたはいくつかはPython3に移行されることになるでしょう。

インストールに特化したフレームワーク:
    Setuptools
    Pip
    Distribute
テストと開発に特化したフレームワーク
    virtualenv
    zc.buildout
    Paver
    Fabric
    py2exe

16.12. さらに読むためには:


Distutilsに関するもの:
他のパッケージフレームワークに関するもの:

0 件のコメント:

コメントを投稿