簡體   English   中英

CX_freeze與ruamel.yaml

[英]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.yamldoc明確指出,您必須使用最新版本的pipsetuptools來安裝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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM