[英]CX_freeze with 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
我究竟做錯了什么?
ruamel.yaml
的doc
明確指出,您必須使用最新版本的pip
和setuptools
來安裝ruamel.yaml
。
CX_Freeze不會調用pip
,也不支持從(正確預配置的) .whl
文件進行安裝。 相反,它似乎以自己的方式調用setup()
。
您可以嘗試做的是在源目錄中創建一個ruamel
目錄,然后在該目錄中創建一個空的__init__.py
文件和yaml
目錄。 在該yaml
目錄中,從解壓縮的最新版本的ruamel.yaml
復制所有.py
文件,跳過setup.py
和所有其他安裝文件。 或者你可以從Bitbucket中檢查這些文件,但是還有更多不必要的事情要處理,如果你沒有通過發布標簽檢查,你就會有一個非發布中間版本的輕微風險。
一旦有效,你將在凍結的應用程序中使用ruamel.yaml
的“純”Python版本。
如果您使用yaml = YAML(typ='safe')
或yaml = YAML(typ='unsafe')
並且您希望從基於C的加載器和轉儲器加速,那么您應該查看使用Windows .whl
文件在PyPI上提供。 它們包括_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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.