Py_Initialize 失败 - 无法加载文件系统编解码器
我正在尝试创建一个简单的C++测试项目,这个项目使用了嵌入式的Python 3.2解释器。项目可以正常构建,但在调用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文件运行没有任何问题。
有人能解释一下这个问题吗?我自己在谷歌上找不到答案。
编辑 1
经过查看Python的源代码,我发现正如错误所说,没有注册任何编解码器搜索函数。codec_register
和PyCodec_Register
都应该是正常的。问题是代码中根本没有调用这些函数。
我其实不太明白这是什么意思,因为我仍然不知道这些函数应该在什么时候、从哪里被调用。引发错误的代码在我其他的Python构建(3.1.3)的源代码中完全缺失。
编辑 2
我在下面回答了自己的问题。
14 个回答
之前提到过一些内容,但简单来说,这就是我在有多个Python安装的环境中找到的解决办法。在这个环境里,我的操作系统全局设置指向了一个不同的安装,而不是我想要使用的那个。
确保你的(本地或全局)环境完全设置好,指向你想要使用的安装。例如,你可能有两个(或更多)安装,比如python27和python33(抱歉这些是Windows路径,但接下来的内容在相应的UNIX风格路径中也是有效的,如果我遗漏了什么,请告诉我,可能DLL的路径会有所不同):
C:\python27_x86
C:\python33_x64
现在,如果你想使用python33的安装,但你的全局环境指向的是python27,确保你更新你的环境设置(虽然PATH
和PYTHONHOME
可能是可选的,比如如果你暂时在本地命令行中工作):
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
、Lib
和site-packages
设置正确是非常重要的。
希望这对你有帮助。
检查一下 PYTHONPATH
和 PYTHONHOME
这两个环境变量,确保它们没有指向 Python 2.x 版本。
所以,不知道为什么,Python的dll文件找不到编码模块。看起来python.exe这个程序能找到,因为它有正确的相对路径。修改搜索路径就能解决这个问题。
至于为什么会这样?我也不知道,不过至少现在能用了。我怀疑可能是我哪里打错了,通常奇怪的错误都是因为这个原因。