1

我无法让 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

我究竟做错了什么?

4

3 回答 3

1

我对天蓝色也有同样的问题。问题是微软构建 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")
于 2019-04-20T17:28:11.940 回答
1

docforruamel.yaml明确指出您必须使用最新版本的和pipsetuptools安装ruamel.yaml.

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

您可以尝试ruamel在源目录中创建一个目录,然后在该目录中创建一个空__init__.py文件和yaml目录。在该目录中,从已解压的最新版本的skipping和所有其他安装 cruft 中yaml复制所有文件。或者,您可以从Bitbucket中签出这些文件,但是还有更多不必要的麻烦需要处理,并且如果您不按发布标签签出,您会冒着获得未发布的中间版本的轻微风险。 一旦成功,您将在冻结的应用程序中拥有一个“纯”Python 版本。.pyruamel.yamlsetup.py
ruamel.yaml

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

于 2017-07-27T15:56:12.127 回答
1

好的,我想出了一个解决方案。我认为这可能是 CX_Freeze 中的一个错误。如果我 pip install 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")],
)
于 2017-07-27T16:14:07.757 回答