我正在尝试将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(实际上,您可能希望确保未设置它)。

09-19 06:00