我无法让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
我做错了什么?
答案 0 :(得分:1)
doc
的{{1}}明确指出您必须使用最新版本的ruamel.yaml
和pip
来安装setuptools
。
CX_Freeze未调用ruamel.yaml
,也不支持从(正确预配置的)pip
文件进行安装。相反,它确实以某种方式调用.whl
。
您可以尝试做的是在源目录中创建一个setup()
目录,然后在该目录中创建一个空的ruamel
文件和__init__.py
目录。在该yaml
目录中,复制解压缩latest version of ruamel.yaml
跳过yaml
的所有.py
个文件以及所有其他安装文件。或者,您可以从Bitbucket检查这些文件,但是还有更多不必要的问题需要处理,如果您没有通过发布标签签出,则可能会遇到非发布中间版本的轻微风险。
一旦有效,你将在冻结的应用程序中拥有setup.py
的“纯”Python版本。
如果您正在使用ruamel.yaml
或yaml = 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")