37

在 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 代码(这个项目是一个解析器生成器)。我似乎无法弄清楚如何从我的代码中正确包含和使用这些文件。有任何想法吗?

4

1 回答 1

43

标准pkgutil 模块的get_data()函数将计算数据的路径,相对于您的包,并通过 Python 用于导入hermes包的任何模块加载器为您检索数据:

import pkgutil
data = pkgutil.get_data('hermes', 'templates/python.tpl')

当然,在某些情况下,您可以只使用从 计算的路径读取数据hermes.__file__,但如果您打算分发项目,请考虑它可能以不同的方式安装在最终用户的机器上:作为普通文件,部署在压缩鸡蛋中存档等。在后一种情况下,您的hermes模块将由 Python 使用 a 导入zipimporter,从而阻止您执行正常操作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')
于 2011-05-05T14:43:32.087 回答