c++ visual Py_Initialize失敗-無法加載文件系統編解碼器




visual studio c++ python (10)

我試圖整理一個使用python 3.2的簡單c ++測試項目。 該項目構建正常,但Py_Initialize引發致命錯誤:

Fatal Python error: Py_Initialize: unable to load the file system codec
LookupError: no codec search functions registered: can't find encoding

最小代碼:

#include <Python.h>

int main (int, char**)
{
  Py_Initialize ();
  Py_Finalize ();
  return 0;
}

操作系統是32位Vista。

使用的python版本是一個python 3.2調試版本,使用VC ++ 10從源代碼構建。

來自同一版本的python_d.exe文件運行沒有任何問題。

有人可以解釋這個問題以及如何解決它嗎? 我自己的google-fu讓我失望了。

編輯1

經過python源代碼後,我發現,正如錯誤所說,沒有註冊編解碼器搜索功能。 codec_registerPyCodec_Register都是應該的。 這就是代碼中沒有任何一個被調用的函數。

我真的不知道這意味著什麼,因為我仍然不知道應該何時以及從哪裡調用這些函數。 引發錯誤的代碼完全從我的其他python構建(3.1.3)的源代碼中丟失。

編輯2

我在下面回答了我自己的問題。


對我來說,當我將Python 64位3.6.4更新到3.6.5時就發生了這種情況。 它拋出了一些錯誤,比如“無法解壓縮python.dll。你有權限。”

Pycharm也無法加載解釋器,即使我在設置中重新加載它。 運行python命令會出現相同的錯誤,無論是否有管理員模式。

原因

安裝Python時出錯, 包含 python安裝目錄C:\ Users \ USERNAME \ AppData \ Local \ Programs \ Python \ Python36中的文件夾丟失

重新安裝Python也可以解決問題。(不刪除和安裝)

再次卸載Python和安裝Python。

因為運行安裝程序只是提取除include文件夾之外的相同文件


我遇到了問題,正在修補這裡提到的不同解決方案。 因為我從Visual Studio運行我的項目,顯然,我需要在Visual Studio中設置環境路徑而不是系統路徑。

在項目解決方案\ properties \ environment中添加一個簡單的PYTHONHOME = PATH \ TO \ PYTHON \ DIR解決了這個問題。


我剛遇到了完全相同的問題(相同的Python版本,操作系統,代碼等)。

您只需要在程序的工作目錄中復制Python的Lib /目錄(在VC上它是.vcproj所在的目錄)


之前已經提到了部分內容,但簡而言之,這對我的環境起作用,我有多個Python安裝和我的全局操作系統環境設置指向不同的安裝,而不是我遇到的時候嘗試使用的安裝。問題。

確保您的(本地或全局)環境完全設置為指向您要使用的安裝,例如,您有兩個(或更多)安裝,假設python27和python33(抱歉這些是Windows路徑,但是以下內容對於等效的UNIX樣式路徑也應該有效,請告訴我這裡我缺少的任何內容(可能DLL路徑可能不同)):

C:\python27_x86

C:\python33_x64

現在,如果您打算使用python33安裝,但您的全局環境指向python27,請確保您更新環境(而PATHPYTHONHOME 可能是可選的(例如,如果您暫時在本地shell中工作)):

PATH="C:\python33_x64;%PATH%"

PYTHONPATH="C:\python33_x64\DLLs;C:\python33_x64\Lib;C:\python33_x64\Lib\site-packages"

PYTHONHOME=C:\python33_x64

請注意,如果開發環境需要,您可能需要/想要將任何其他庫路徑附加到PYTHONPATH ,但是正確設置DLLsLibsite-packages是非常重要的。

希望這可以幫助。


在我的情況下,對於Windows,如果您安裝了多個python版本,如果PYTHONPATH指向一個版本,則其他版本不起作用。 我發現如果你只是刪除PYTHONPATH,它們都可以正常工作


嘗試在Mac OS下安裝brew的python3也屬於同樣的事情! 這裡的問題是,在Mac OS中,自製軟件使“真正的”python比你想像的更深。 你會從自製軟件輸出中想到

$ echo $PYTHONHOME
/usr/local/Cellar/python3/3.6.2/
$ echo $PYTHONPATH
/usr/local/Cellar/python3/3.6.2/bin

這是正確的,但調用$ PYTHONPATH / python3立即崩潰與中止6“無法找到編碼。” 這是因為雖然$ PYTHONHOME看起來像一個完整的安裝,有一個bin,lib等,但它不是真正的Python,它在Mac OS“框架”中。 做這個:

PYTHONHOME=/usr/local/Cellar/python3/3.x.y/Frameworks/Python.framework/Versions/3.x
PYTHONPATH=$PYTHONHOME/bin

(適當地替換版本號),它將正常工作。


因此,由於某種原因,python dll無法找到編碼模塊。 python.exe可執行文件顯然找到它,因為它具有預期的相對路徑。 修改搜索路徑有效。

所有這一切的原因? 不知道但至少它有效。 我非常懷疑某個地方有一個錯字,這通常是看起來奇怪的錯誤的原因。


核心原因很簡單:Python沒有找到它的模塊目錄,因此它當然也不能加載encodings

關於嵌入的Python文檔說“ Py_Initialize()根據其最佳猜測計算模塊搜索路徑”......“特別是,它查找名為lib/pythonX.Y的目錄”

然而,如果模塊安裝在(只) lib - 相對於python二進製文件 - 上面的猜測是錯誤的。

雖然文檔說PYTHONHOMEPYTHONPATH被認為是,但我們觀察到情況並非如此; 他們的實際存在或內容完全無關緊要。

唯一有效的是在Py_SetPath()調用Py_SetPath() ,例如[path-to]\lib作為參數。

當然,這只是一個嵌入場景的選項,其中一個人可以直接訪問和控制代碼; 使用現成的解決方案,可能需要特殊步驟來解決問題。


發布版本似乎出現了問題,或者未能包含相應的編解碼器,或者錯誤地識別用於系統API的編解碼器。 由於python_d可執行文件正在運行, os.getfsencoding()會返回什麼? (使用C API在Initialize / Finalize調用之間調用)


我有這個問題與python 3.5,anaconda 3,Windows 7 32位。 我通過將我的pythonX.lib和pythonX.dll文件移動到我的工作目錄並調用來解決它

Py_SetPythonHome(L"C:\\Path\\To\\My\\Python\\Installation");

在初始化之前,它可以找到它所需的標題,我的路徑是“... \ Anaconda3 \”。 調用Py_SetPythonHome的額外步驟對我來說是必需的,否則我最終會得到python導入文件的其他奇怪錯誤。