我正在尝试将python嵌入C应用程序中。目前,我正在尝试使以下hello world style示例正常工作
#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文章中的答案之一已说明) (应该将其设置为python bin文件的父文件夹,在本例中为anaconda。这样做不能解决问题。)。
编辑:
应用@John Bollinger建议的更改似乎可以部分解决问题。现在产生的错误
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
最佳答案
据我了解上述问题,我收到此错误的原因
是因为我需要为python查找提供特定的路径
库/模块。设置PYTHONHOME和/或PYTHONPATH应该可以修复
那么这个问题。
[...]
我是否已正确诊断问题?
听起来像。 Python解释器根据PYTHONHOME
或其安装位置和编译时配置选择默认的模块路径,但是当您将解释器嵌入另一个程序时,后者不在窗口之内。解释器使用PYTHONPATH
标识其他目录以搜索模块。
使用独立解释器时,通常不应设置PYTHONHOME
,但在嵌入解释器时这样做是合理的。
如果是这样,我应该将这两个环境变量设置为什么?
我系统上的python3 -h
输出包括:
PYTHONPATH : ':'-separated list of directories prefixed to the
default module search path. The result is sys.path.
PYTHONHOME : alternate <prefix> directory (or <prefix>:<exec_prefix>).
The default module search path uses <prefix>/pythonX.X.
特别要注意有关Python期望在
PYTHONHOME
命名目录中找到的内容的提示。在您的情况下,您可能应该设置
PYTHONHOME
,因为解释器无法识别如何找到系统模块。变量应采用的实际值取决于所需的Python实现所处的位置(这可能是与您的程序链接到其Python库的同一实现)。对于系统Python,在我的机器上是PYTHONHOME=/usr/lib:/usr/lib64
对于安装在/ opt / anaconda2中的Anaconda 2,它将是
PYTHONHOME=/opt/anaconda2/lib
除非需要Python搜索模块的其他位置,否则无需设置
PYTHONPATH
(实际上,您可能希望确保未设置它)。