如何从源代码使用package_data中的数据?

在setup.py,我指定package_data这样的:如何从源代码使用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 module's get_data() function将计算路径到您的数据,相对于你的包,并通过任何模块加载Python中导入hermes包检索数据为您提供:

import pkgutil 

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

当然在某些情况下您可以使用从hermes.__file__计算的路径读取数据,但是如果您打算分发项目,请考虑它可能以不同方式安装在最终用户的计算机上:作为普通文件,部署在压缩的蛋档案中等。在后一种情况下,您的hermes模块将由Python使用zipimporter导入,从而阻止y OU从做一个正常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代码库增加一个运行时依赖,你可能想consdider看pkg_resources module,它可以给你同样的结果,但增加了其他功能。

import pkg_resources 

data = pkg_resources.resource_string('hermes', 'templates/python.tpl')

以上是 如何从源代码使用package_data中的数据? 的全部内容, 来源链接: utcz.com/qa/257962.html

回到顶部