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 を使うと perlrubyの%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に含めたいファイルを全て書き下す必要があります. 二度手間ですが, 仕方ありません.

参照

これらについての正確な情報は,

などをご覧下さい.