2009-12-21 70 views
10

我发现了一个解决方案,通过以下方式在library.zip中添加文件:Extend py2exe to copy files to the zipfile where pkg_resources can load themPy2exe:将静态文件嵌入exe文件本身并访问它们

当library.zip不包含exe时,我可以访问我的文件。

我在library.zip的目录中添加一个文件:foo/media中的文件:text.txt。 我使用此代码:

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

你不应该使用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下工作。

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() 

问候

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) 
    ... 

作品一种享受!

+0

整洁的解决方案!我用它,它很棒! – foresightyj 2013-05-03 08:08:10

+0

这将工作在PNG文件?我即将尝试,但如果你知道我会很感激听到。 – 2013-12-10 04:02:41

+0

好吧,有一些文件格式问题,因为我想我会研究那些,但除了它应该工作,对吗? – 2013-12-10 04:44:56

相关问题