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

Ant*_*ton 62 c++ python

我试图整理一个使用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
Run Code Online (Sandbox Code Playgroud)

最小代码:

#include <Python.h>

int main (int, char**)
{
  Py_Initialize ();
  Py_Finalize ();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

操作系统是32位Vista.

使用的python版本是一个python 3.2调试版本,使用VC++ 10从源代码构建.

来自同一版本的python_d.exe文件运行没有任何问题.

有人可以解释这个问题以及如何解决它吗?我自己的google-fu让我失望了.

编辑1

经过python源代码后,我发现,正如错误所说,没有注册编解码器搜索功能.这两个codec_registerPyCodec_Register是他们应该的.这就是代码中没有任何一个被调用的函数.

我真的不知道这意味着什么,因为我仍然不知道应该何时以及从何处调用这些函数.从我的其他python构建(3.1.3)的源代码中完全没有引发错误的代码.

编辑2

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

Tro*_*ydm 44

检查PYTHONPATHPYTHONHOME环境变量,确保它们不指向Python 2.x.

http://bugs.python.org/issue11288

  • @voo_doo 在您的 shell 上,您可以使用例如 `echo $PYTHONPATH` 进行检查。使用 `unset PYTHONPATH` 取消设置。 (2认同)

bos*_*ssi 30

之前已经提到了部分内容,但简而言之,这对我的环境有用,我有多个Python安装和我的全局操作系统环境设置指向不同的安装,而不是我遇到的时候尝试使用的安装.问题.

确保您的(本地或全局)环境完全设置为指向您要使用的安装,例如,您有两个(或更多)安装,比如说python27和python33(抱歉这些是Windows路径,但是以下内容对于等效的UNIX风格路径也应该有效,请让我知道我在这里缺少的任何东西(可能DLL路径可能不同)):

C:\python27_x86

C:\python33_x64

现在,如果您打算使用python33安装,但您的全局环境指向python27,请确保您更新环境(虽然PATH并且PYTHONHOME 可能是可选的(例如,如果您暂时在本地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如果需要通过你的开发环境,但有你的DLLs,Libsite-packages适当建立是最重要的.

希望这可以帮助.


Sem*_*ino 11

其核心原因很简单:Python没有找到它的modules目录,所以它当然可以不加载encodings,过

嵌入的Python文档说“ Py_Initialize()根据其最佳猜测来计算模块搜索路径” ...“尤其是,它将查找名为lib/pythonX.Y” 的目录

但是,如果将模块安装在(lib相对于python二进制文件而言)(只是),则上述猜测是错误的。

尽管文档说了这一点PYTHONHOMEPYTHONPATH得到了重视,但我们观察到情况并非如此。它们的实际存在或内容完全无关紧要。

是有效果的唯一的事情就是打电话Py_SetPath()与例如[path-to]\lib作为参数之前 Py_Initialize()

当然,这仅是嵌入式方案的一种选择,在这种方案中,人们可以直接访问和控制代码。对于现成的解决方案,可能需要采取特殊步骤来解决该问题。

  • 最好和最准确的答案,IMO。投票! (2认同)

小智 5

在python3k中,启动需要编码模块,该模块可以在PYTHONHOME \ Lib目录中找到。实际上,API Py_Initialize()进行了初始化并导入了编码模块。确保PYTHONHOME \ Lib在sys.path中,并检查其中的encodings模块。


aqu*_*tle 5

我在 python 3.5、anaconda 3、windows 7 32 位上遇到了这个问题。我通过将 pythonX.lib 和 pythonX.dll 文件移动到我的工作目录并调用来解决它

Py_SetPythonHome(L"C:\\Path\\To\\My\\Python\\Installation");
Run Code Online (Sandbox Code Playgroud)

在初始化之前,它可以找到它需要的标题,我的路径是“...\Anaconda3\”。我需要调用 Py_SetPythonHome 的额外步骤,否则我最终会在 python 导入文件时遇到其他奇怪的错误。


use*_*405 5

尝试在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
Run Code Online (Sandbox Code Playgroud)

是正确的,但是调用$ 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
Run Code Online (Sandbox Code Playgroud)

(适当地替换版本号),它将可以正常工作。


Ant*_*ton -2

因此,由于某种原因,python dll 无法找到编码模块。python.exe 可执行文件显然找到了它,因为它具有预期的相对路径。修改搜索路径有效。

这一切的原因是什么?不知道但至少它有效。我高度怀疑我在某个地方出现了拼写错误,这通常是出现奇怪错误的原因。

  • 为什么这是一个被接受的答案?这个答案没有解决办法。 (33认同)
  • 您在这里谈论的搜索路径是什么? (3认同)
  • 你能展示一下你在解决方案中做了什么修改吗? (3认同)