2

我正在尝试使用 cx_Freeze 将 python 包转换为 linux 二进制文件(最终也是一个 Windows 可执行文件)。该软件包依赖于多个 egg 文件,因为我知道 cx_Freeze 对 egg 文件不适用,所以我解压缩了 egg 文件。其中一个egg文件在某个包'test.package'中有一个资源字符串文件'test.resource',以包含我使用的这个资源字符串文件 -

include_files = ['test/package/test.resource']

现在我看到这个文件与二进制文件一起被复制到目标目录但是当我尝试运行二进制文件时出现错误 - “IOError:[Errno 2] 没有这样的文件或目录:'test/package/test.resource '"

试图读取文件的代码是这样做的:

from pkg_resources import resource_string
strings = resource_string("test.package", "test.resource")

如何添加此资源文件以便生成的二进制文件可用?

4

2 回答 2

2

由于接受的答案是细节,我想我会提供一个对我有用的解决方案。它不需要您解压缩您的 egg 文件,但也不排除它。

情况:我有一个应用程序,我们使用冷冻机与eskycx_Freeze一起打包,但这些信息应该同样适用于cx_Freeze直接使用的应用程序。该应用程序使用了treq库,其中包括以下行treq.__import__

__version__ = resource_string(__name__, "_version").strip()

pkg_resources用来确定文件的_version文件路径并手动将其添加到我的zip_includes. 我们确保它与其他treq库文件一起放置在预期的位置。在我的setup.py文件中,我有:

setup(
    name=...,
    version=...,
    install_requires=[
        ...,
        treq==15.0.0,
        ...
    ],
    ...,
    options={
        ...,
        "bdist_esky": {
            ...,
            "freezer_options": {
                # This would be "zip_includes" in options if just using cx_Freeze without esky
                "zipIncludes": [
                    # Manually copy the treq _version resource file into our library.zip
                    (pkg_resources.resource_filename('treq', '_version'), 'treq/_version')
                ],
                "packages": [..., "treq", ...]
                ...,
            ...,
        ...,
    ...,
)

奖励:虽然不必解压缩库才能使其工作,但通常它似乎很有用,您可能希望始终在安装时解压缩它们(a la python setup.py develop)。将以下行添加到您的应用程序的简单问题setup.cfg

[easy_install]
zip_ok = 0

然后,当您运行时python setup.py develop,您的依赖项site-packages将以扩展目录形式安装到其中。

于 2015-07-15T23:16:15.767 回答
1

如果有人需要答案,我可以使用“zip_includes”而不是“include_files”来解决问题

于 2013-07-22T23:57:24.663 回答