Py2exe:在exe文件中嵌入静态文件并访问它们

jea*_*hel 10 resources py2exe python-3.x

我找到了一个解决方案,通过以下方式在library.zip中添加文件:扩展py2exe以将文件复制到zip文件,pkg_resources可以在其中加载它们.

当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")
Run Code Online (Sandbox Code Playgroud)

我尝试使用pkg_resources,但我认为我不明白,因为我可以直接打开"library.zip".

我的问题是当library.zip嵌入exe时我该怎么做?

最好的祝福

让 - 米歇尔·

Dar*_*hop 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']}},
)
Run Code Online (Sandbox Code Playgroud)

然后在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)
    ...
Run Code Online (Sandbox Code Playgroud)

有效!


Ian*_*ens 0

您不应该使用 pkg_resources 来检索library.zip 文件。您应该使用它来检索添加的资源。

假设您有以下项目结构:

setup.py
foo/
    __init__.py
    bar.py
    media/
        image.jpg
Run Code Online (Sandbox Code Playgroud)

您可以使用resource_string(或者最好是resource_stream)来访问image.jpg:

img = pkg_resources.resource_string(__name__, 'media/image.jpg')
Run Code Online (Sandbox Code Playgroud)

那应该“有效”。至少当我将媒体文件捆绑到 EXE 中时是这样。(抱歉,我已经离开了使用 py2exe 的公司,所以没有可用的示例。)

您也可以尝试使用 pkg_resources.resource_filename(),但我认为这在 py2exe 下不起作用。