2011-04-17 242 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解决了这个问题。

相关问题