Setup.pyで、次のようにpackage_dataを指定しました。
packages=['hermes'],
package_dir={'hermes': 'hermes'},
package_data={'hermes': ['templates/*.tpl']},
そして私のディレクトリ構造は大まかに
hermes/
|
| docs/
| ...
| hermes/
|
| __init__.py
| code.py
| templates
|
| python.tpl
|
| README
| setup.py
問題は、ソースコードのテンプレートディレクトリにあるファイルを使用して、pythonコード(このプロジェクトはパーサジェネレーターです)を書き出すことができるようにする必要があることです。理解できないようです。コードからこれらのファイルを適切にインクルードして使用する方法。何かアイデアはありますか?
標準 pkgutilモジュールのget_data()
function は、パッケージに関連するデータへのパスを計算し、使用するモジュールローダーPythonを介してデータを取得します。 hermes
パッケージをインポートするには:
_import pkgutil
data = pkgutil.get_data('hermes', 'templates/python.tpl')
_
もちろん、場合によっては_hermes.__file__
_から計算されたパスを使用してデータを読み取ることもできますが、プロジェクトを配布する場合は、エンドユーザーのマシンにさまざまな方法でインストールされる可能性があることを考慮してください。プレーンファイルとして、 zip形式のEggアーカイブなどにデプロイされます。後者の場合、hermes
モジュールはzipimporter
を使用してPythonによってインポートされ、通常のopen(path).read()
を実行できなくなります。
_>>> import hermes
>>> hermes.__loader__
<zipimporter object "/home/pat/.cascade/virt/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.Egg">
_
distribute
コードベースにランタイム依存関係を追加しても問題がない場合は、 _pkg_resources module
_ を検討することをお勧めします。これにより、同じ結果が得られますが、他の機能が追加されます。
_import pkg_resources
data = pkg_resources.resource_string('hermes', 'templates/python.tpl')
_