我试图整理一个使用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_register和PyCodec_Register是他们应该的.这就是代码中没有任何一个被调用的函数.
我真的不知道这意味着什么,因为我仍然不知道应该何时以及从何处调用这些函数.从我的其他python构建(3.1.3)的源代码中完全没有引发错误的代码.
编辑2
我在下面回答了我自己的问题.
Tro*_*ydm 44
检查PYTHONPATH和PYTHONHOME环境变量,确保它们不指向Python 2.x.
http://bugs.python.org/issue11288
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,Lib并site-packages适当建立是最重要的.
希望这可以帮助.
Sem*_*ino 11
其核心原因很简单:Python没有找到它的modules目录,所以它当然可以不加载encodings,过
嵌入的Python文档说“ Py_Initialize()根据其最佳猜测来计算模块搜索路径” ...“尤其是,它将查找名为lib/pythonX.Y” 的目录
但是,如果将模块安装在(lib相对于python二进制文件而言)(只是),则上述猜测是错误的。
尽管文档说了这一点PYTHONHOME并PYTHONPATH得到了重视,但我们观察到情况并非如此。它们的实际存在或内容完全无关紧要。
是有效果的唯一的事情就是打电话Py_SetPath()与例如[path-to]\lib作为参数之前 Py_Initialize()。
当然,这仅是嵌入式方案的一种选择,在这种方案中,人们可以直接访问和控制代码。对于现成的解决方案,可能需要采取特殊步骤来解决该问题。
小智 5
在python3k中,启动需要编码模块,该模块可以在PYTHONHOME \ Lib目录中找到。实际上,API Py_Initialize()进行了初始化并导入了编码模块。确保PYTHONHOME \ Lib在sys.path中,并检查其中的encodings模块。
我在 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 导入文件时遇到其他奇怪的错误。
尝试在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 可执行文件显然找到了它,因为它具有预期的相对路径。修改搜索路径有效。
这一切的原因是什么?不知道但至少它有效。我高度怀疑我在某个地方出现了拼写错误,这通常是出现奇怪错误的原因。
| 归档时间: |
|
| 查看次数: |
94857 次 |
| 最近记录: |