CX_freeze与ruamel.yaml

问题描述 投票:1回答:3

我无法让CX_Freeze包含ruamel.yaml包和build_exe。

我也尝试将它添加到“包”选项中

build_exe_options = {
    ...
    "packages": [
        ...
        "ruamel.yaml",
        ...
    ]
    ...
}
cx_Freeze.setup(
    ...
    executables=[cx_Freeze.Executable("pyhathiprep/__main__.py",
                                  targetName="pyhathiprep.exe", base="Console")],
)

我明白了

File "C:\Users\hborcher\PycharmProjects\pyhathiprep\.env\lib\site-packages\cx_Freeze\finder.py", line 350, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'ruamel.yaml'

我已经尝试将它添加到“namespace_packages”之类的

build_exe_options = {
    ...
    "namespace_packages": ["ruamel.yaml"]
    ...
}
cx_Freeze.setup(
    ...
    executables=[cx_Freeze.Executable("pyhathiprep/__main__.py",
                                  targetName="pyhathiprep.exe", base="Console")],
)

我明白了

File "C:\Users\hborcher\PycharmProjects\pyhathiprep\.env\lib\site-packages\cx_Freeze\finder.py", line 221, in _FindModule
return None, module.__path__[0], info
TypeError: '_NamespacePath' object does not support indexing

我究竟做错了什么?

python cx-freeze ruamel.yaml
3个回答
1
投票

docruamel.yaml明确指出你必须使用最新版本的pipsetuptools来安装ruamel.yaml

CX_Freeze不调用pip,也不支持从(正确预配置的).whl文件安装。相反,它似乎确实以自己的方式调用setup()

您可以尝试做的是在源目录中创建一个ruamel目录,然后在该目录中创建一个空的__init__.py文件和yaml目录。在那个yaml目录中复制所有.py文件从一个解压缩的latest version of ruamel.yaml跳过setup.py和所有其他安装cruft。或者你可以从Bitbucket检查这些文件,但是还有更多不必要的事情需要处理,如果你没有通过发布标签检查,你会冒一个非发布的中间版本的风险。 一旦有效,你将在冻结的应用程序中拥有ruamel.yaml的“纯”Python版本。

如果你正在使用yaml = YAML(typ='safe')yaml = YAML(typ='unsafe')并且你希望从基于C的加载器和转储器加速,那么你应该看看使用PyPI上提供的Windows .whl文件。它们包括_ruamel_yaml.cpXY-win_NNN.pyd文件。如果你不知道你的目标(python和/或win32 | win_amd64,你应该能够包含所有这些目标,而ruamel.yaml会在它启动时选择正确的目标(实际上只有from _ruamel_yaml import CParser, CEmitter并假设Python解释器知道该怎么做)。


1
投票

好的,我想出了一个解决方案。我认为它可能是CX_Freeze中的一个错误。如果我pip安装ruamel.base和ruamel.yaml cx_freeze似乎正确安装一切。这是事实,即使我要求它只包括ruamel.yaml。

如果我同时安装了ruamel.base和ruamel.yaml,那么这可行...

build_exe_options = {
    ...
    "namespace_packages": ["ruamel.yaml"]
    ...
}
cx_Freeze.setup(
    ...
    executables=[cx_Freeze.Executable("pyhathiprep/__main__.py",
                              targetName="pyhathiprep.exe", base="Console")],
)

1
投票

我和azure有同样的问题。问题是microsoft构建azure包的方式 - 您可以导入azure.something.something_else.module,但不能直接导入azure。 cx_freeze需要能够直接找到文件夹azure(或者在你的情况下,文件夹ruamel),而不仅仅是子文件夹。

我不得不去我访问的azure文件夹下的每个目录,并确保那里有一个init.py文件。在那之后,cx_freeze能够完美地找到它。

另一种选择是直接将文件夹从您知道的路径(直接链接到您的站点包,或将ruamel目录复制到您的程序目录并从那里复制)到建立文件夹中作为您的设置的一部分。我为我的数据文件这样做:

import shutil
shutil.copytree("icons","build/exe.win32-3.6/icons")
© www.soinside.com 2019 - 2024. All rights reserved.