我找到了一个解决方案,可以通过以下方式在library.zip中添加文件:Extend py2exe to copy files to the zipfile where pkg_resources can load them。
当library.zip不包含exe时,我可以访问我的文件。
我在目录中添加了一个文件:text.txt:library.zip中的foo / media。 我使用这段代码:
import pkg_resources
import zipfile
from cStringIO import StringIO
my_data = pkg_resources.resource_string(__name__,"library.zip")
filezip = StringIO(my_data)
zip = zipfile.ZipFile(filezip)
data = zip.read("foo/media/text.txt")
我尝试使用pkg_resources,但我认为我不明白,因为我可以直接打开“library.zip”。
我的问题是当library.zip嵌入exe中时我该怎么做?
最好的问候
让 - 米歇尔
答案 0 :(得分:10)
我拼凑了一个相当简洁的解决方案,但它没有使用pkg_resources。
我需要将生产力工具作为独立的EXE分发,即全部捆绑到一个.exe文件中。我还需要在使用这些工具时发送通知,我通过Logging API使用基于文件的配置来发送通知。我发现了logging.cfg文件,使得更难以有效地关闭这些通知,即删除松散的文件......这可能会破坏应用程序。
以下是我的setup.py中的有趣内容:
LOGGING_CFG = open('main/resources/logging.cfg').read()
setup(
name='productivity-tool',
...
# py2exe extras
console=[{'script': productivity_tool.__file__.replace('.pyc', '.py'),
'other_resources': [(u'LOGGINGCFG', 1, LOGGING_CFG)]}],
zipfile=None,
options={'py2exe': {'bundle_files': 1, 'dll_excludes': ['w9xpopen.exe']}},
)
然后在productivity_tool.py的启动代码中:
from win32api import LoadResource
from StringIO import StringIO
from logging.config import fileConfig
...
if __name__ == '__main__':
if is_exe():
logging_cfg = StringIO(LoadResource(0, u'LOGGINGCFG', 1))
else:
logging_cfg = 'main/resources/logging.cfg'
fileConfig(logging_cfg)
...
工作待遇!!!
答案 1 :(得分:1)
谢谢,但我找到了解决方案
my_data = pkg_resources.resource_stream("__main__",sys.executable) # get lib.zip file
zip = zipfile.ZipFile(my_data)
data = zip.read("foo/media/doc.pdf") # get my data on lib.zip
file = open(output_name, 'wb')
file.write(data) # write it on a file
file.close()
最好的问候
答案 2 :(得分:0)
您不应该使用pkg_resources来检索library.zip文件。您应该使用它来检索添加的资源。
假设您有以下项目结构:
setup.py
foo/
__init__.py
bar.py
media/
image.jpg
您可以使用resource_string(或者,最好是resource_stream)来访问image.jpg:
img = pkg_resources.resource_string(__name__, 'media/image.jpg')
那应该“正常工作”。至少它是在我将媒体文件捆绑在EXE中时完成的。 (对不起,我从那时起就离开了我使用py2exe的公司,所以没有一个工作的例子来画画。)
您也可以尝试使用pkg_resources.resource_filename(),但我认为这不适用于py2exe。