CX_freeze与ruamel.yaml

时间:2017-07-27 14:45:05

标签: python cx-freeze ruamel.yaml

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

我做错了什么?

3 个答案:

答案 0 :(得分:1)

doc的{​​{1}}明确指出您必须使用最新版本的ruamel.yamlpip来安装setuptools

CX_Freeze未调用ruamel.yaml,也不支持从(正确预配置的)pip文件进行安装。相反,它确实以某种方式调用.whl

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

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

答案 1 :(得分: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")],
)

答案 2 :(得分:1)

我也遇到了同样的天蓝色问题。问题是Microsoft构造Azure软件包的方式-您可以导入azure.something.something_else.module,但不能直接导入Azure。 cx_freeze需要能够直接找到azure文件夹(或者在您的情况下为ruamel文件夹),而不仅仅是子文件夹。

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

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

import shutil
shutil.copytree("icons","build/exe.win32-3.6/icons")