Python: 可执行的zip文件可以包含数据文件吗?

24 投票
4 回答
14615 浏览
提问于 2025-04-16 13:58

作为一个刚接触Python的新手,我最近发现可以通过在压缩包里放一个__main__.py文件,直接执行一个.zip文件。这对Python代码来说效果很好,但我能不能把其他类型的文件也打包进去,并在我的脚本中访问它们呢?如果可以的话,怎么做呢?

我的最终目标是把一些图片文件和Python代码一起打包成一个.zip文件,然后在应用程序中使用这些图片,而不需要把它们提取到硬盘上。我还想把版权声明、发布说明等信息也打包进去,这样整个应用和它的数据文件就都在一个压缩包里,可以直接执行,而不需要提取到其他地方。

4 个回答

6

你可以简单地使用 pkgutil.get_data(),就像在 这个回答 中提到的那样。

6

在我的Linux电脑上,进程并没有打开的文件句柄或者映射到自己zip文件的内存,所以大概没有办法“神奇地”访问它。

不过,自己创建访问方式并不难。你可以像这样创建一个 __main__.py 文件:

import os, zipfile

me = zipfile.ZipFile(os.path.dirname(__file__), 'r')
f = me.open('other.txt')
print f.read()
f.close()
me.close()

补充说明:刚才说得有点简略,为了完整性:

$ echo "Hello ZIP" > other.txt
$ zip testo.zip __main__.py other.txt
$ python testo.zip
Hello ZIP
21

你可以使用 pkg_resources 里的函数来访问文件:

# __main__.py
import pkg_resources
from PIL import Image

print pkg_resources.resource_string(__name__, 'README.txt')

im = Image.open(pkg_resources.resource_stream('app', 'im.png'))
im.rotate(45).show()

这里的 zipfile 包含:

.
|-- app
|   |-- im.png
|   `-- __init__.py
|-- README.txt
`-- __main__.py

要让 zipfile 可执行,运行:

$ echo '#!/usr/bin/env python' | cat - zipfile > program-name
$ chmod +x program-name

测试的方法是:

$ cp program-name /another-dir/
$ cd /another-dir && ./program-name

撰写回答