我无法让CX_Freeze在build_exe中包含ruamel.yaml包。
我还尝试将其添加到"packages“选项中,如下所示
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我做错了什么?
发布于 2017-07-27 23:56:12
ruamel.yaml的doc明确指出,您必须使用最新版本的pip和setuptools来安装ruamel.yaml。
CX_Freeze不调用pip,也不支持从(正确预配置的) .whl文件安装。相反,它似乎确实以自己的方式调用了setup()。
您可以尝试做的是在源目录中创建一个ruamel目录,然后在该目录中创建一个空的__init__.py文件和yaml目录。在yaml目录中,从解压latest version of ruamel.yaml中复制所有.py文件,跳过setup.py和所有其他安装程序。或者,您也可以从Bitbucket签出这些文件,但这样会有更多不必要的繁琐工作要处理,如果您不通过发布标签签出,那么您可能会有一个未发布的中间版本的轻微风险。
一旦成功,您将在冻结的应用程序中拥有一个“纯”Python版本的ruamel.yaml。
如果您使用的是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解释器知道要做什么)。
发布于 2017-07-28 00:14:08
好吧,我想出了一个解决方案。我认为这可能是CX_Freeze中的一个bug。如果我通过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")],
)发布于 2019-04-21 01:28:12
我在azure上也遇到了同样的问题。问题出在微软构建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")https://stackoverflow.com/questions/45354131
复制相似问题