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

发布于 2024-11-05 03:14:29 字数 472 浏览 5 评论 0原文

在 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

问题是我需要使用源代码中的 templates 目录中的文件,以便我可以编写 python 代码(该项目是一个解析器生成器) 。我似乎无法弄清楚如何从我的代码中正确包含和使用这些文件。有什么想法吗?

In setup.py, I have specified package_data like this:

packages=['hermes'],
package_dir={'hermes': 'hermes'},
package_data={'hermes': ['templates/*.tpl']},

And my directory structure is roughly

hermes/
 |
 | docs/
 | ...
 | hermes/
    | 
    | __init__.py
    | code.py
    | templates
        |
        | python.tpl
 |
 | README
 | setup.py

The problem is that I need to use files from the templates directory in my source code so I can write out python code (this project is a parser generator). I can't seem to figure out how to properly include and use these files from my code. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

掩耳倾听 2024-11-12 03:14:29

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

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

当然,在某些情况下,您可以使用以下命令读取数据 :从 hermes.__file__ 计算出的路径,但如果您计划分发您的项目,请考虑它可能以不同的方式安装在最终用户的计算机上:作为纯文件,部署在压缩的 Egg 存档中,在后一种情况下,您的 hermes 模块将由 Python 使用 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 模块,它可以为您提供相同的结果,但增加了其他功能。

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

The standard pkgutil module's get_data() function will calculate the path to your data, relative to your package, and retrieve the data for you via whatever module loader Python used to import the hermes package:

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

Of course in certain cases you could just read your data using a path calculated from hermes.__file__, but if you plan to distribute your project, consider that it may be installed in different ways on the end user's machine: as plain files, deployed in a zipped egg archive, etc. In the latter case, your hermes module will have been imported by Python using a zipimporter, preventing you from doing a normal 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">

If you're okay with adding a runtime dependency on the distribute codebase, you may want to consider looking at the pkg_resources module, which can give you the same result but adds other capabilities.

import pkg_resources
data = pkg_resources.resource_string('hermes', 'templates/python.tpl')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文