オプション1:パッケージデータとしてインストールする
Pythonパッケージのルート内にデータファイルを配置する主な利点は、ファイルがユーザーのシステム(Windows、Mac、Linux、一部のモバイルプラットフォーム、またはEgg内など)のどこに存在するかを気にする必要がないことです。data
どこにどのようにインストールされているかに関係なく、Pythonパッケージルートからの相対ディレクトリをいつでも見つけることができます。
たとえば、次のようなプロジェクトレイアウトがあるとします。
project/
foo/
__init__.py
data/
resource1/
foo.txt
関数を追加し__init__.py
て、データファイルへの絶対パスを見つけることができます。
import os
_ROOT = os.path.abspath(os.path.dirname(__file__))
def get_data(path):
return os.path.join(_ROOT, 'data', path)
print get_data('resource1/foo.txt')
出力:
/Users/pat/project/foo/data/resource1/foo.txt
プロジェクトが卵としてインストールされた後、パスdata
は変更されますが、コードを変更する必要はありません。
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
オプション2:固定場所にインストールする
別の方法は、データをPythonパッケージの外部に配置し、次のいずれかを行うことです。
- 場所持っている
data
設定ファイル経由で渡さを、コマンドライン引数または
- 場所をPythonコードに埋め込みます。
プロジェクトの配布を計画している場合、これはあまり望ましくありません。これを本当に実行したい場合data
は、タプルのリストを渡してファイルの各グループの宛先を指定することにより、ターゲットシステムの好きな場所にインストールできます。
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
更新:Pythonファイルを再帰的にgrepするシェル関数の例:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}