首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理pyz应用程序中的资源

管理pyz应用程序中的资源
EN

Stack Overflow用户
提问于 2020-06-03 14:15:07
回答 1查看 680关注 0票数 1

我有一个多模块的python应用程序,我已经用python3 -m zipapp打包在一个python3 -m zipapp可执行文件中。

我想用运行所需的一些资源(一些文本文件)来部署这个应用程序。我尝试过将这些文本文件添加到project_root/res中,然后执行类似于with open("./res/resource1.txt", "r") as f: do_something()的操作,但当然找不到该文件。

如何读取嵌入在zipapp应用程序中的文本文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-27 00:48:44

代码语言:javascript
复制
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')

请注意,这个实例中的ressome_subfolder必须是完整的,而不仅仅是目录(区别在于是否存在名为__init__.py的空文件);否则zipapp将忽略它们。因此,上述示例中的文件夹结构必须是:

代码语言:javascript
复制
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 ),您可以简单地:

代码语言:javascript
复制
 import sys
 import zipfile
 
 with zipfile.ZipFile(sys.argv[0]) as zf:
      with zf.open('res/resource1.txt') as f:
           print(f.read())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62175062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档