Amazon.co.jp ウィジェット
スポンサードリンク

2007年11月04日

Pylons の setup.py

pylons の setup.py の記述方法がよく分かっていなかったですが、以下の文章を読むと少しわかった気になりました。

「Python モジュールの配布」 > 簡単な例によると、setup.py に
from distutils.core import setup
setup(name='foo',
      version='1.0',
      py_modules=['foo'],
      )
のように書いて、
python setup.py sdist
と実行すると、foo-1.0.tar.gz というアーカイブファイルが生成されるそうです。

なんだか pylons プロジェクトで自動生成されるsetup.py もdistutils の仕様にのっとっていそうですが、気になるのがimport 部分。たとえば昨日作成した welle プロジェクトのsetup.py はデフォルトでこうなっています。


try:
    from setuptools import setup, find_packages
except ImportError:
    from ez_setup import use_setuptools
    use_setuptools()
    from setuptools import setup, find_packages

setup(
    name='welle',
    version="",
    #description='',
    #author='',
    #author_email='',
    #url='',
    install_requires=["Pylons>=0.9.6.1"],
    packages=find_packages(exclude=['ez_setup']),
    include_package_data=True,
    test_suite='nose.collector',
    package_data={'welle': ['i18n/*/LC_MESSAGES/*.mo']},
    #message_extractors = {'welle': [
    #        ('**.py', 'python', None),
    #        ('templates/**.mako', 'mako', None),
    #        ('public/**', 'ignore', None)]},
    entry_points="""
    [paste.app_factory]
    main = welle.config.middleware:make_app

    [paste.app_install]
    main = pylons.util:PylonsInstaller
    """,
)
先ほどの例が distutils.core からsetup関数をimport していたのと違い、setuptools からsetup 関数をimport しています。 そこで、setuptools を調べてみると、こんな感じ。

>>> import setuptools
>>> help(setuptools)
Help on package setuptools:

NAME
    setuptools - Extensions to the 'distutils' for large or complex distributions

(以下略)
setuptools って distutils の拡張だったんです ・・・と思ったら、setuptools のページにもろに書いてありました。
setuptools is a collection of enhancements to the Python distutils (for Python 2.3.5 and up on most platforms; 64-bit platforms require a minimum of Python 2.4) that allow you to more easily build and distribute Python packages, especially ones that have dependencies on other packages.
New and Changed setup() Keywordsによると、setuptools を使うことでdistutils のデフォルトに加えて、setup() 関数に以下のキーワードが使えるようになります。
  • include_package_data
  • exclude_package_data
  • exclude_package_data
  • zip_safe
  • install_requires
  • entry_points
  • extras_require
  • setup_requires
  • dependency_links
  • namespace_packages
  • test_suite
  • tests_require
  • test_loader
  • eager_resources
なお、distutils のデフォルトキーワードは下記(Python 2.4)。
  • name
  • version
  • author
  • autho_email
  • maintainer
  • maintainer_email
  • url
  • description
  • long_description
  • download_url
  • classifiers
Pylons はこれらのオプションを使って、パッケージのインストール設定を記述していたんですね。同僚のPythonista が使っていた dependency_links もここで定義されていたのかぁ。setuptools のマニュアルは読んどかなきゃですね。

また、良く似たファイルで setup.cfg ってのもありますが、これは

$ python setup.py
を実行するときのデフォルト引数を指定する設定ファイルです。(詳しくはマニュアル参照)。pylons のプロジェクトの場合、デフォルトはこんな感じ。
[egg_info]
tag_build = dev
tag_svn_revision = true

[easy_install]
find_links = http://www.pylonshq.com/download/

[pudge]
theme = pythonpaste.org

# Add extra doc files here with spaces between them
docs = docs/index.txt

# Doc Settings
doc_base = docs/
dest = docs/html

# Add extra modules here separated with commas
modules = welle
title = Welle
organization = Pylons

# Highlight code-block sections with Pygments
highlighter = pygments

# Optionally add extra links
#organization_url = http://pylonshq.com/
#trac_url = http://pylonshq.com/project
settings = no_about=true

# Optionally add extra settings
#           link1=/community/ Community
#           link2=/download/ Download

[publish]
doc-dir=docs/html
make-dirs=1

# Babel configuration
[compile_catalog]
domain = welle
directory = welle/i18n
statistics = true

[extract_messages]
add_comments = TRANSLATORS:
output_file = welle/i18n/welle.pot
width = 80

[init_catalog]
domain = welle
input_file = welle/i18n/welle.pot
output_dir = welle/i18n

[update_catalog]
domain = welle
input_file = welle/i18n/welle.pot
output_dir = welle/i18n
previous = true
でも、setup.py で使えるコマンド一覧を出しても、

C:\Users\junya\Projects\welle>python setup.py --help-commands
Standard commands:
  build             build everything needed to install
  build_py          "build" pure Python modules (copy to build directory)
  build_ext         build C/C++ extensions (compile/link to build directory)
  build_clib        build C/C++ libraries used by Python extensions
  build_scripts     "build" scripts (copy and fixup #! line)
  clean             clean up temporary files from 'build' command
  install           install everything from build directory
  install_lib       install all Python modules (extensions and pure Python)
  install_headers   install C/C++ header files
  install_scripts   install scripts (Python or otherwise)
  install_data      install data files
  sdist             create a source distribution (tarball, zip file, etc.)
  register          register the distribution with the Python package index
  bdist             create a built (binary) distribution
  bdist_dumb        create a "dumb" built distribution
  bdist_rpm         create an RPM distribution
  bdist_wininst     create an executable installer for MS Windows

Extra commands:
  rotate            delete older distributions, keeping N newest files
  develop           install package in 'development mode'
  setopt            set an option in setup.cfg or another config file
  saveopts          save supplied options to setup.cfg or other config file
  egg_info          create a distribution's .egg-info directory
  nosetests         Run unit tests using nosetests
  install_egg_info  Install an .egg-info directory for the package
  alias             define a shortcut to invoke one or more commands
  easy_install      Find/get/install Python packages
  bdist_egg         create an "egg" distribution
  test              run unit tests after in-place build

usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help
publish とか update_catalog とかないんだよね。どこで定義されているんだろう。 もっと勉強しなきゃ!!



posted by junya at 01:48 | Comment(7) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
pudgeやpublishはbuildutilsを導入すると使えますよ。
Posted by aodag at 2007年11月11日 11:24
update_catalogはBabelのようですね
Posted by aodag at 2007年11月11日 22:19
aodag さん、アドバイスありがとうございます。

$ easy_install buildutils pudge
でpudge, buildutils を入れて、
$ python setup.py addcommand -p buildutils.pudge_command
でコマンドを追加してみました。

http://wiki.pylonshq.com/pages/viewpage.action?pageId=11174319
を参考に、
$ python setup.py pudge
とすると、pygments がないと言われたので入れたのですが、それでもエラー。Kid のバージョンと相性が悪いようです。

なお、
$ python setup.py --help-commands
でpudge の説明が出てもよさそうですが、なぜ出ないんでしょう。
Posted by junya at 2007年11月12日 23:34
babel の方は、国際化対応のライブラリですね。

また、
$ python setup.py addcommand --list-command s
でbuildutils で追加可能なコマンドが一覧できました。
publish の方は、
$ python setup.py addcommand -p buildutils.publish_command
で有効になりました。
Posted by junya at 2007年11月12日 23:48
pudgeは僕が試したときもpygmentsに関するエラーで動きませんでしたが、setup.cfgからpudgeのhighlight設定を外したら動きましたね。buildutilsのコマンドの追加方法は、知りませんでした。setup.pyにbuildutilsをimportしたらpudgeとかpublishができていたので、それでいいのかと思ってましたが、addcommandで追加するのが、正式な方法なんでしょうかね。
Posted by aodag at 2007年11月13日 06:44
あと、翻訳お疲れさまです。
Posted by aodag at 2007年11月13日 06:45
僕の場合は、pygments も入れてしまいました。

また、addcommand に関しては、ちゃんとsetup.py を書いて
$ python setup.py develop
とすれば入るのかも知れません。(分からない〜)

翻訳は、会社の有志で楽しみながらやっています♪
Posted by junya at 2007年11月15日 00:38
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。