setup.pyについてのいくつかのメモ
モジュールにソースコード以外のファイルを添付する
添付の種類は4種類あります.
(1 - 3) setupの引数として指定する(scripts, package_data, data_files).
setup.py内のsetup関数の引数としてファイルを指定します. scripts, package_data, data_filesの違いは, インストール先です.
- scripts
- Scriptsフォルダ(C:\Python32\Scripts)
- data_files
- パッケージ(C:\Python32\Lib\site-packages\(パッケージ名))
- package_data
- サブパッケージ(C:\Python32\Lib\site-packages\(パッケージ名)\(サブパッケージ))
括弧内はPython 3.2.x Windows版の場合の位置です.
次のようなsetup.pyを書いて, python setup.py installすると…
from setuptools import setup
setup(
#パッケージの定義, 2つのサブパッケージを含む
name="foods",
packages = ["fish", "meat"],
package_dir={'fish':'fish', "meat":"meat"},
#サブパッケージごとのデータファイル
#元々のフォルダ構造を反映する
package_data={
"fish": ["red/tuna.js"],
"meat": ["beaf.js"],
},
#サブパッケージには所属しないデータファイル
#元々のフォルダ構造は無視される
#("配置先フォルダ名", ["ファイル", "ファイル", "ファイル"...]), ... の形式
#配置先フォルダはネストしてよい
data_files = [
("raw-fish", ["salmon.txt"]),
("fishery/processing/kamaboko", "sasa.bmp kamaboko/yaki.rb".split()),
],
#スクリプトファイル
#元々のフォルダ構造は無視される
#配置先もScriptsの直下のみ
scripts = "sashimi.sh sh_files/arajiru.bat".split(),
#zip_safe=Trueにすると, 全てのファイルを単一の.egg(zipファイル)にまとめる
#デフォルトでは, zip_safe=True
zip_safe=False,
)
#ちなみに, str.split を使うと perlやrubyの%w() のように
#空白で区切って, 文字列のリストが作れるので便利
こういうふうに配置されます.
C:\Python32\lib\site-packages\seafoods\EGG-INFO\scripts\arajiru.bat C:\Python32\lib\site-packages\seafoods\EGG-INFO\scripts\sashimi.sh C:\Python32\lib\site-packages\seafoods\fish\red\tuna.js C:\Python32\lib\site-packages\seafoods\fish\__init__.py C:\Python32\lib\site-packages\seafoods\fishery\processing\kamaboko\sasa.bmp C:\Python32\lib\site-packages\seafoods\fishery\processing\kamaboko\yaki.rb C:\Python32\lib\site-packages\seafoods\meat\beaf.js C:\Python32\lib\site-packages\seafoods\meat\__init__.py C:\Python32\lib\site-packages\seafoods\raw-fish\salmon.txt C:\Python32\Scripts\arajiru.bat C:\Python32\Scripts\sashimi.sh
(4) MANIFEST.in
READMEやHISTORYのように, パッケージの使用時には役に立たないが, sdistには含めたいようなファイルは, MANIFEST.inファイルに記述します.
include README include HISTORY include junk/food/*.txt
ワイルドカードも使用可です.
落とし穴
1 - 3 の setupの引数に指定する方法ですが, そのままではpython setup sdistした時に, zipやtarにファイルが追加されません!
少なくとも, 私が試した限りではそうでした. なんてこった!バグか!?
zipやtarに追加するには, MANIFEST.inに含めたいファイルを全て書き下す必要があります. 二度手間ですが, 仕方ありません.
参照
これらについての正確な情報は,
- http://www.python.jp/doc/2.7/distutils/index.html(日本語 2.7)
- http://docs.python.org/release/3.2.2/distutils/index.html(英語 3.2)
などをご覧下さい.