python:可执行zip文件包括数据文件?

相当新的python我最近才发现通过放置一个__main__.py文件在文件的顶部直接执行.zip文件的能力。 这对python代码非常适用,但是我可以捆绑其他types的文件并使用我的脚本访问它们吗? 如果是这样,怎么样?

我的最终目标是将一些图像文件和python代码捆绑在一个.zip文件中,然后在应用程序中使用这些图像,而不必将其提取到磁盘。 我还想捆绑一个版权声明,发行说明等,以便整个应用程序和它的数据文件在一个zip文件中,可以执行,而不必在任何地方解压。

您可以使用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包含:

  。
 |  - 应用程序
 |  |  -  im.png
 |  `__init__.py
 |  -  README.txt
 ` -  __main__.py 

要使zipfile可执行,请运行:

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

testing它:

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

只需使用pkgutil.get_data()按照这个答案build议

至less在我的Linux机器上,没有打开的文件句柄或映射内存的过程到自己的zip文件,所以想必没有办法“神奇地”访问它。

但是,创build自己的访问并不困难。 像这样创build一个__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 

pkgutil.get_data(package, resource)采用包和资源的名称。 这意味着你必须把你的数据文件放在zip文件中的一个包中。

所以例如一个zip文件包含:

 __main__.py zippeddata/__init__.py zippeddata/data.txt 

__init__.py文件可以是空的或只是一个注释,但你需要一个使zippeddata可导入。

然后在__main__.py您只需调用:

 data = pkgutil.get_data('zippeddata', 'data.txt')