Является ли мой диагноз причины «Не удалось найти независимые от платформы библиотеки <prefix>» правильным и как я могу это исправить? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь встроить Python в C-приложение. На данный момент я пытаюсь заставить работать следующий пример "Привет, мир", стиль

#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 В сообщении указывалось, что он должен быть установлен в родительскую папку файла bin Python, который в данном случае является anaconda. Это не решило проблему.).

Edit:

Применение изменений, предложенных @John Bollinger, кажется, частично решает проблему. Полученная ошибка теперь

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

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Как я понимаю вышеупомянутая проблема, причина, по которой я получаю эту ошибку, заключается в том, что мне нужно указать определенный путь для 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

Для моей Anaconda 2, установленной в / opt / anaconda2, это будет

PYTHONHOME=/opt/anaconda2/lib

Вам не нужно устанавливать PYTHONPATH (и, на самом деле, вы можете убедиться, что он установлен un ), если нет дополнительных мест, в которых Python должен искать модули.

0 голосов
/ 23 марта 2019

Во-первых, заслуга в том, что я указал путь к (по общему признанию, очень, очень хакерскому) решению этой проблемы, принадлежит @John_Bollinger.Во-вторых, я публикую этот ответ только в качестве решения для тех, кто не может решить проблему правильным способом (см. Ответ @John_Bollinger).

На моем компьютере было установлено несколько версий python, все они были установлены локально в моем профиле.Когда я определил «PYTHONHOME», я сделал это в своем «.bash_profile».Я использовал IDE для разработки приложения на C со встроенным кодом Python.Когда я запускал приложение, я получал сообщение об ошибке выше.Первая проблема заключалась в том, что функция Py_Initialize (), используемая для запуска интерпретатора python, использует путь, сохраненный в PYTHONHOME, для поиска местоположения интерпретатора для запуска.Так как я определил PYTHONHOME только локально через мой .bash_profile, то произошло то, что "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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...