2011-04-17 108 views
34

我試圖把一個簡單的C++測試項目,使用python 3.2。該項目的基礎不錯,但Py_Initialize提出了一個致命的錯誤: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)的源代碼中丟失。

EDIT 2

下面回答我自己的問題。

回答

4

因此,出於某種原因,python dll無法找到編碼模塊。 python.exe可執行文件明顯發現它,因爲它具有預期的相對路徑。修改搜索路徑的作品。

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

+0

你在這裏談論什麼搜索路徑? – 2011-07-27 21:25:46

+0

python尋找模塊的路徑。這是一段時間以前,所以我不記得確切地在哪裏或如何。 – Anton 2011-08-02 12:40:14

+2

您能否展示您在解決方案中修改過的內容? – 2016-02-15 00:08:09

29

檢查PYTHONPATH和PYTHONHOME系統變量,並確保它不點對Python 2.x的

http://bugs.python.org/issue11288

+0

是的,我看到了,並指出它到Python 3.1(我正常的Python安裝)。可悲的是,這並沒有解決問題。 – Anton 2011-04-17 16:34:37

+0

將它指向正確的Python 3.2版本。 – 2011-04-17 19:14:54

+0

也試過了,不起作用。 – Anton 2011-04-17 20:59:45

2

似乎有一些與發佈版本腳麻要麼沒有包含相應的編解碼器否則會錯誤識別用於系統API的編解碼器。由於python_d可執行文件正在運行,那麼對於os.getfsencoding()返回的結果是什麼? (使用C API在初始化/完成調用之間調用它)

+0

調試告訴我'sys.getfilesystemencoding'正確返回'mbcs'。 – Anton 2011-04-18 07:37:35

+0

如果您創建了3.2版本的發行版並將其與發佈模式可執行文件鏈接起來,會發生什麼? – ncoghlan 2011-04-19 06:36:44

2

從python3k,啓動需要編碼模塊,它可以在PYTHONHOME \ Lib目錄中找到。 實際上,API Py_Initialize()執行init並導入編碼模塊。 確保PYTHONHOME \ Lib在sys.path中,並檢查編碼模塊是否存在。

5

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

你只需要複製你的程序的工作目錄Python的lib /目錄(在VC是其中的.vcproj是目錄)

+2

這可能工作,但我會說這不是一個很好的解決方案。它並沒有解決搜索路徑錯誤的原因,只是避免了這個問題,並且還破壞了目錄樹。我建議在'Python/import.c'中的'find_module'函數和'PC/getpathp.c'(IIRC)中的'calculate_path'函數中放置一個斷點,以找出它實際正在查找的位置以及爲什麼它不是你的期望。也就是說,當談到這些事情時,我可能有點完美主義。 – Anton 2012-09-22 00:33:58

+1

我不同意。這是一個非常有效的解決方案:你嵌入自己的Python,你知道它在哪裏,它包含了什麼。它也更容易再分發(記得在Blender的舊版本中,當你必須安裝正確版本的Python,或者它會在運行時崩潰?現在它被捆綁在ProgramFiles/Blender /中)。我想這取決於你的使用情況。 – Calvin1602 2012-09-24 07:28:00

+0

哦,等等......你的意思是(現在寫我看到)複製目錄不是嗎?我讀到了複製目錄的內容,這會很麻煩...對不起。 – Anton 2012-09-24 08:13:48

18

這個零件之前已經提到過,但簡而言之,這是什麼工作對於我的環境,我有多個Python安裝和我的全局操作系統環境設置,指向不同的安裝,而不是我在遇到問題時嘗試使用的環境。

確保您的(本地或全球)環境爲完全設置指向您要使用的安裝,例如,你有兩個(或更多)的安裝,讓我們說一個python27和python33(對不起,這些是Windows路徑,但以下應該是有效的等效的UNIX風格的路徑,請讓我知道我在這裏失蹤的任何東西(可能是DLL的路徑可能會有所不同)):

C:\python27_x86

C:\python33_x64

現在,如果你想與你的python33安裝,但您的全球環境指向python27工作,確保您更新環境這樣(雖然PATHPYTHONHOME可能是可選的(例如,如果你在當地殼暫時無法工作)):

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如果需要通過你的開發環境,但讓您的DLLs,Libsite-packages正確設置是非常重要的。

希望這會有所幫助。

2

我有這個問題與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導入文件的地方得到其他奇怪的錯誤。

0

嘗試在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等,但它不是Mac OS「框架」中的實際Python。這樣做:

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

(根據需要替換版本號),它會正常工作。

0

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

0

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

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

相關問題