【问题标题】:Py2exe: Embed static files in exe file itself and access themPy2exe:在 exe 文件本身中嵌入静态文件并访问它们
【发布时间】:2009-12-21 12:39:14
【问题描述】:

我找到了在 library.zip 中添加文件的解决方案:Extend py2exe to copy files to the zipfile where pkg_resources can load them

当 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 中时,我该怎么做?

最好的问候

让-米歇尔

【问题讨论】:

    标签: resources python-3.x py2exe


    【解决方案1】:

    我为此拼凑了一个相当简洁的解决方案,但它不使用 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)
        ...
    

    工作愉快!!!

    【讨论】:

    • 这适用于 png 文件吗?我正要试一试,但如果你知道的话,我将不胜感激。
    • 好的,有一些文件格式问题,我想我会研究一下,但除此之外它应该可以工作,对吧?
    • 抱歉,已经有一段时间了。我无法想象为什么嵌入图像不起作用;请发布您发现的内容。
    【解决方案2】:

    谢谢,我找到了解决办法

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

    最好的问候

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 2017-12-23
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多