【问题标题】:Is my diagnosis of the cause of "Could not find platform independent libraries <prefix>" correct and how can I fix it?我对“找不到与平台无关的库 <prefix>”的原因的诊断是否正确,我该如何解决?
【发布时间】:2019-08-13 19:35:47
【问题描述】:

我正在尝试将 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 帖子中的一个答案指出应该将它设置为python的bin文件的父文件夹,在这种情况下是anaconda。这样做并没有解决问题。)。

编辑:

应用@John Bollinger 建议的更改似乎可以部分解决问题。现在产生的错误是

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

【问题讨论】:

    标签: python c macos


    【解决方案1】:

    据我了解上述问题,我收到此错误的原因 是因为我需要为 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 库的实现相同)。对于 system Python,在我的机器上,它会是

    PYTHONHOME=/usr/lib:/usr/lib64
    

    对于我的 Anaconda 2,安装在 /opt/anaconda2 中,它会是

    PYTHONHOME=/opt/anaconda2/lib
    

    您不需要设置PYTHONPATH(事实上,您可能希望确保它设置),除非您希望 Python 在其他位置搜索模块。

    【讨论】:

    • @John Bollinger,感谢您的回复。我将 PYTHONHOME 更改为“..../anaconda/lib”,这似乎部分解决了问题。不过,我仍然遇到错误(请参阅我的编辑)。
    • @HXSP1947,很可能您的 PYTHONHOME 仍然是错误的,但解释器忽略了一些诊断消息,因为它根本没有设置。即使您完整提供了设置,我也无法验证您的设置,因为详细信息是特定于系统的,但 (1) 一定要提供 absolute 路径; (2) 确保您不需要使用&lt;prefix&gt;:&lt;exec-prefix&gt; 表单; (3) 您最安全的选择是将PYTHONHOME 指向您链接的库的Python 实现; (4) 确保动态链接器选择了正确的 libpython3.X(ldd 程序可以提供帮助)。
    • @John_Bollinger,感谢您的帮助。我能够明显地找到解决方案(尽管不是一个很好的解决方案)。如果你好奇,我把它贴在下面。但是,我接受您的回答是正确的,因为它是“正确的方式”。
    【解决方案2】:

    首先,感谢@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
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 2022-08-18
      • 2019-12-18
      • 2013-01-10
      • 1970-01-01
      • 2021-08-23
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多