我有一个多模块的python应用程序,我已经用python3 -m zipapp打包在一个python3 -m zipapp可执行文件中。
我想用运行所需的一些资源(一些文本文件)来部署这个应用程序。我尝试过将这些文本文件添加到project_root/res中,然后执行类似于with open("./res/resource1.txt", "r") as f: do_something()的操作,但当然找不到该文件。
如何读取嵌入在zipapp应用程序中的文本文件?
发布于 2020-06-27 00:48:44
import pkgutil
pkgutil.get_data(<module name>, 'resource1.txt')将返回一个字节对象。
<module name>应该是一个字符串,它应该包含到resource1.txt所在文件夹的路径,就好像您试图导入它一样;例如,如果需要/res/some_subfolder/foo.txt,那么您将执行pkgutil.get_data('yourmodule.res.some_subfolder', 'foo.txt')。
请注意,这个实例中的res和some_subfolder必须是完整的,而不仅仅是目录(区别在于是否存在名为__init__.py的空文件);否则zipapp将忽略它们。因此,上述示例中的文件夹结构必须是:
project root
| main.py
| <whatever other files you have>
| res
| | __init__.py
| | some_subfolder
| | | __init__.py
| | | foo.txt同样,如果您愿意,这些文件可能是空白的,它们只需存在(尽管如果您将代码放入其中,则可以执行import res (或import res.some_subfolder),并且它将运行res/__init__.py,如果您想这样做的话,这可能是从一个地方组织所有资源的有用方法)。顺便说一句,如果有人像大多数Python程序员一样,不熟悉模块的工作原理,那么这里是Python的一个快速教程。
此外,如果您只是使用zipapp (相对于用pyinstaller创建的exe ),您可以简单地:
import sys
import zipfile
with zipfile.ZipFile(sys.argv[0]) as zf:
with zf.open('res/resource1.txt') as f:
print(f.read())https://stackoverflow.com/questions/62175062
复制相似问题