Py_Initialize 失败 - 无法加载文件系统编解码器

76 投票
14 回答
156902 浏览
提问于 2025-04-16 15:55

我正在尝试创建一个简单的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_registerPyCodec_Register都应该是正常的。问题是代码中根本没有调用这些函数。

我其实不太明白这是什么意思,因为我仍然不知道这些函数应该在什么时候、从哪里被调用。引发错误的代码在我其他的Python构建(3.1.3)的源代码中完全缺失。

编辑 2

我在下面回答了自己的问题。

14 个回答

40

之前提到过一些内容,但简单来说,这就是我在有多个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中,但确保你的DLLsLibsite-packages设置正确是非常重要的。

希望这对你有帮助。

53

检查一下 PYTHONPATHPYTHONHOME 这两个环境变量,确保它们没有指向 Python 2.x 版本。

http://bugs.python.org/issue11288

-2

所以,不知道为什么,Python的dll文件找不到编码模块。看起来python.exe这个程序能找到,因为它有正确的相对路径。修改搜索路径就能解决这个问题。

至于为什么会这样?我也不知道,不过至少现在能用了。我怀疑可能是我哪里打错了,通常奇怪的错误都是因为这个原因。

撰写回答