我正在尝试使用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")
如何添加此资源文件以使其可用于生成的二进制文件?
答案 0 :(得分:2)
由于接受的答案很清楚,我认为我提供的解决方案对我有用。它不需要你解压缩你的鸡蛋文件,但也不排除它。
情况:我有一个应用程序,我们使用cx_Freeze
冻结程序与esky打包,但此信息同样适用于仅使用{{1}的应用程序直接该应用程序使用treq库,其中包含cx_Freeze
中的以下行:
treq.__import__
我使用__version__ = resource_string(__name__, "_version").strip()
确定pkg_resources
文件的文件路径,并手动将其添加到_version
。我们确保它与zip_includes
库文件的其余部分一起放在预期的位置。在我的treq
文件中,我有:
setup.py
奖金:虽然没有解压缩库以使其正常工作,但一般情况下,您可能希望在安装时始终解压缩它们(la {{ 1}})。将以下几行添加到您的应用程序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", ...]
...,
...,
...,
...,
)
中是一件简单的事情:
python setup.py develop
然后,当您运行setup.cfg
时,您的依赖项将以其扩展目录形式安装到[easy_install]
zip_ok = 0
中。
答案 1 :(得分:1)
如果有人需要答案我使用'zip_includes'代替'include_files'