web-dev-qa-db-ja.com

ソースコードのpackage_dataのデータを使用するにはどうすればよいですか?

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コード(このプロジェクトはパーサジェネレーターです)を書き出すことができるようにする必要があることです。理解できないようです。コードからこれらのファイルを適切にインクルードして使用する方法。何かアイデアはありますか?

34
Scott

標準 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')
_
38
samplebias