モジュールにソースコード以外のファイルを添付する
添付の種類は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)
などをご覧下さい.