我正在尝试将python嵌入到一个C应用程序中。目前,我正试图让下面的hello world样式示例发挥作用
#include <..../anaconda3/include/python3.7m/Python.h> // I've abbreviated this path for privacy
int main()
{
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\nprint('Today is', ctime(time()))\n");
Py_FinalizeEx();
return(EXIT_SUCCESS);
}
我已经能够编译这个例子了,但是在运行它时我得到了下面的错误
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
我已经安装了多个版本的python (python3,我正在使用macOS),并且希望运行我已经安装的特定的anaconda版本。正如我所理解的,我之所以会出现这个错误,是因为我需要为python提供一个特定的路径来查找库/模块。设置PYTHONHOME和/或PYTHONPATH将解决此问题。但是,我不确定我应该将这个值设置为什么。
我的问题是两方面的。(1)我是否正确地诊断了问题?(2)如果是,我应该将这两个环境变量设置为什么?具体来说,具体的路径是什么?虽然有其他几篇关于这个问题的文章,但似乎没有人给出路径应该是什么(我只尝试将PYTHONHOME变量设置为“./ anaconda”,因为this post中的一个答案指出,它应该设置为python的bin文件的父文件夹,在本例中是anaconda。这样做并不能解决问题。)
编辑:
应用约翰·博林格提出的改变似乎部分解决了这个问题。由此产生的错误是现在
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
发布于 2019-03-22 19:22:06
正如我所理解的,我之所以会出现这个错误,是因为我需要为python提供一个特定的路径来查找库/模块。设置PYTHONHOME和/或PYTHONPATH将解决此问题。 ..。 我正确地诊断出这个问题了吗?
听起来很像。Python解释器根据PYTHONHOME
或其安装位置和编译时配置来选择默认模块路径,但是当您将解释器嵌入到另一个程序中时,后者就不在窗口了。解释器使用PYTHONPATH
标识用于搜索模块的其他目录。
在使用独立解释器时,通常不应该设置PYTHONHOME
,但是在嵌入解释器时这样做是合理的。
如果是这样,我应该将这两个环境变量设置为什么?
python3 -h
在我的系统上的输出包括:
PYTHONPATH:‘:’-以默认模块搜索路径为前缀的目录列表。结果是sys.path。PYTHONHOME :备用目录(或:)。默认模块搜索路径使用/pythonX.X。
特别注意关于Python希望在PYTHONHOME
命名的目录中找到什么的提示。
在您的示例中,您可能应该设置PYTHONHOME
,因为解释器不识别如何找到系统模块。变量应该使用的实际值取决于所需的Python实现所在的位置(这可能与您链接程序的python库所在的实现相同)。对于系统Python,在我的机器上,它应该是
PYTHONHOME=/usr/lib:/usr/lib64
对于安装在/opt/ Anaconda 2中的Anaconda 2,它将是
PYTHONHOME=/opt/anaconda2/lib
您不应该需要设置PYTHONPATH
(实际上,您可能希望确保它是_un_set),除非您希望有更多的位置来搜索模块。
发布于 2019-03-22 23:39:13
首先,@John_Bollinger为我指出了通往这个问题的解决方案(诚然非常非常麻烦)的途径,这一点值得赞扬。其次,我发布这个答案只是为了解决那些无法以正确的方式解决问题的人(参见@John_Bollinger答案)。
我的机器上有多个版本的python,所有这些版本都安装在我的配置文件中。当我定义"PYTHONHOME“时,我是在".bash_profile”中这样做的。我使用IDE开发了一个带有嵌入式python代码的C应用程序。当我运行应用程序时,我会得到上面得到的错误。第一个问题是用于启动python解释器的函数"Py_Initialize()“使用存储在PYTHONHOME中的路径来查找要启动的解释器的位置。由于我只在本地通过我的.bash_profile定义了PYTHONHOME,所以发生的情况是"Py_Initialize()“没有正确初始化。
第二个问题与解释器查找模块有关。在纠正了上述问题后,解释器无法找到运行它所需的基本核心模块。我仍然不知道为什么(但我怀疑这与第一个问题有关)。我的解决方案是手动指定我想要使用的模块的路径。要获得这些信息,请运行python解释器并记录以下代码的输出:
import sys
print(sys.path)
将这里输出的所有路径作为路径的一部分放在C代码中。完整的工作解决方案是
#include <..../anaconda3/include/python3.7m/Python.h>
int main(int argc, char **argv, char **envp)
{
putenv("PYTHONHOME=<path to python interpreter>"); // location of interpreter. In my case ..../anaconda3/bin/python3.7m
Py_SetPath(L"<paths to python modules>"); // output from print(sys.path) above in normal path format; i.e. path1:path2:...
Py_Initialize();
// do your stuff
Py_FinalizeEx(); // close the interpreter and free the memory its using
}
https://stackoverflow.com/questions/55305988
复制相似问题