首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我对“找不到独立于平台的库<prefix>”的原因的诊断正确吗?我如何修复它?

我对“找不到独立于平台的库<prefix>”的原因的诊断正确吗?我如何修复它?
EN

Stack Overflow用户
提问于 2019-03-22 18:43:33
回答 2查看 1.9K关注 0票数 1

我正在尝试将python嵌入到一个C应用程序中。目前,我正试图让下面的hello world样式示例发挥作用

代码语言:javascript
运行
复制
#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);
}

我已经能够编译这个例子了,但是在运行它时我得到了下面的错误

代码语言:javascript
运行
复制
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。这样做并不能解决问题。)

编辑:

应用约翰·博林格提出的改变似乎部分解决了这个问题。由此产生的错误是现在

代码语言:javascript
运行
复制
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,在我的机器上,它应该是

代码语言:javascript
运行
复制
PYTHONHOME=/usr/lib:/usr/lib64

对于安装在/opt/ Anaconda 2中的Anaconda 2,它将是

代码语言:javascript
运行
复制
PYTHONHOME=/opt/anaconda2/lib

您不应该需要设置PYTHONPATH (实际上,您可能希望确保它是_un_set),除非您希望有更多的位置来搜索模块。

票数 2
EN

Stack Overflow用户

发布于 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解释器并记录以下代码的输出:

代码语言:javascript
运行
复制
import sys
print(sys.path)

将这里输出的所有路径作为路径的一部分放在C代码中。完整的工作解决方案是

代码语言:javascript
运行
复制
#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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55305988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档