我无法让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
我究竟做错了什么?
doc
的ruamel.yaml
明确指出你必须使用最新版本的pip
和setuptools
来安装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解释器知道该怎么做)。
好的,我想出了一个解决方案。我认为它可能是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")],
)
我和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")