Python 如何在cx\U冻结二进制文件中包含资源文件

Python 如何在cx\U冻结二进制文件中包含资源文件,python,python-2.6,cx-freeze,Python,Python 2.6,Cx Freeze,我正在尝试使用cx\U Freeze将python包转换为linux二进制文件(最终也是windows可执行文件)。这个包依赖于多个egg文件,因为我知道cx_Freeze不能很好地处理egg文件,所以我解压缩了egg文件。其中一个egg文件在某个包“test.package”中有一个资源字符串文件“test.resource”,以包含我使用的这个资源字符串文件- include_files = ['test/package/test.resource'] 现在我看到这个文件和二进制文件一起被

我正在尝试使用cx\U 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")

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

如果有人需要答案,我可以使用“zip_includes”而不是“includes_files”来获得答案。

既然接受的答案对细节很清楚,我想我会提供一个适合我的解决方案。它不要求您解压缩您的egg文件,但也不排除它

情况:我有一个应用程序,我们使用
cx\u Freeze
freezer打包,但此信息同样适用于直接使用
cx\u Freeze
的应用程序。该应用程序使用库,其中包含
treq.\uuuuu import\uuuuu
中的以下行:

__version__ = resource_string(__name__, "_version").strip()
我使用
pkg\u资源
确定
\u版本
文件的文件路径,并手动将其添加到我的
zip\u文件中。我们确保它与其他
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 develope
)。只需将以下行添加到应用程序的
setup.cfg

[easy_install]
zip_ok = 0

然后,当您运行
python setup.py develope
时,您的依赖项将以展开的目录形式安装到
站点包中。

您是否将
测试
包解压缩到工作目录或其他地方?如果没有,则必须使用
(源路径、目标路径、相对路径)的元组
,而不是仅使用单个
路径
字符串。另外,包是否在顶层实际命名为
test.package
?换句话说,
import-test
import-test.package
工作,只是
resource\u字符串('test.package',…)
不工作,或者前者也不工作?谢谢您的回复。我解压缩了工作目录中的“test”包。我看到test.resource文件在test/package/test.resource相对目录中被复制到目标目录,在该目录中二进制文件作为cx\U冻结调用的一部分被放置。导入测试和导入测试包都应该工作。现有的调用资源_字符串('test.package',…)在egg文件包含在路径“should work”或“tested and do work”中时有效?我们需要弄清楚你的应用程序的打包方式,还是
pkg_资源
的工作方式有问题,第一步是看
import
pkg_资源
是否有同样的问题。我将“import test”和“import test.package”放在资源字符串()的前面打电话,他们都成功了。你能通过setup.py吗?你的答案不清楚。我试过你的建议,但没用!