Я долго искал ответ на свой вопрос, но ни один из тех, что я нашел, похоже, не решил мою проблему.
Я пытаюсь встроить Python в мой код C ++ с помощью функций, предоставляемых Python (Python.h, функции Py_xxx и т. Д.). Однако у меня проблемы с тем, чтобы заставить мою программу на C ++ вызывать правильный интерпретатор Python. Действительно, на моей машине есть несколько интерпретаторов (кстати, это Mac под управлением OSX 10.7.5). У меня есть версия Python по умолчанию, предустановленная с ОС (версия 2.7.1), и у меня есть другая версия, установленная anaconda (версия 2.7.7). Мне нужно использовать версию, установленную anaconda, потому что мне нужны дополнительные библиотеки, доступные с anaconda, которые не установлены по умолчанию с OSX Python.
Мой код C ++ выглядит следующим образом:
char* python_home_ = (char*) "/anaconda";
char* program_name_ = (char*) "/anaconda/bin/python2.7";
Py_SetPythonHome(python_home_);
Py_SetProgramName(program_name_);
Py_Initialize();
printf("python home: %s\n", Py_GetPythonHome());
printf("program name: %s\n", Py_GetProgramName());
printf("get path: %s\n", Py_GetPath());
printf("get prefix: %s\n", Py_GetPrefix());
printf("get exec prefix: %s\n", Py_GetExecPrefix());
printf("get prog full path: %s\n", Py_GetProgramFullPath());
PyRun_SimpleString("import sys");
printf("path: ");
PyRun_SimpleString("print sys.path");
printf("version: ");
PyRun_SimpleString("print sys.version");
И результат:
python home: /anaconda
program name: /anaconda/bin/python2.7
get path: /anaconda/lib/python27.zip:/anaconda/lib/python2.7/:/anaconda/lib/python2.7/plat-darwin:/anaconda/lib/python2.7/plat-mac:/anaconda/lib/python2.7/plat-mac/lib-scriptpackages:/anaconda/lib/python2.7/../../Extras/lib/python:/anaconda/lib/python2.7/lib-tk:/anaconda/lib/python2.7/lib-old:/anaconda/lib/python2.7/lib-dynload
get prefix: /anaconda
get exec prefix: /anaconda
get prog full path: /anaconda/bin/python2.7
path: ['/anaconda/lib/python2.7/site-packages/sphinxcontrib_googleanalytics-0.1dev_20140616-py2.7.egg', '/anaconda/lib/python27.zip', '/anaconda/lib/python2.7', '/anaconda/lib/python2.7/plat-darwin', '/anaconda/lib/python2.7/plat-mac', '/anaconda/lib/python2.7/plat-mac/lib-scriptpackages', '/anaconda/Extras/lib/python', '/anaconda/lib/python2.7/lib-tk', '/anaconda/lib/python2.7/lib-old', '/anaconda/lib/python2.7/lib-dynload', '/anaconda/lib/python2.7/site-packages', '/anaconda/lib/python2.7/site-packages/PIL', '/anaconda/lib/python2.7/site-packages/setuptools-2.2-py2.7.egg']
version: 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]
Тем не менее, когда я запускаю Python Анаконды в терминале, вот что я получаю
Alexs-MacBook-Pro:lib alex$ /anaconda/bin/python2.7
Python 2.7.7 |Anaconda 1.9.1 (x86_64)| (default, Jun 2 2014, 12:48:16)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
И результат с питоном по умолчанию
Alexs-MacBook-Pro:lib alex$ /usr/bin/python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Таким образом, кажется, что даже если я указываю другой путь для исполняемого файла, вызывается Python по умолчанию в OSX (и конфликтует с библиотеками anaconda, которые я пытаюсь импортировать позже).
Поэтому мой вопрос прост: что я делаю неправильно и почему пути, которые я указываю через Py_Setxxx, не указывают на правильный исполняемый файл?
Большое спасибо за Вашу помощь!
Alex
Я испытал ту же проблему. Решением для меня было вызвать программу так:
DYLD_LIBRARY_PATH=/path_to_anaconda/lib ./program
Это потому, что общие библиотеки, используемые во время выполнения, были загружены из неправильного, оригинального каталога OSX.
(LD_LIBRARY_PATH в Linux)
Используйте «import os» и «print (os.sys.path)», чтобы вернуть Python домой, затем:
Py_SetPythonHome((wchar_t*)L"/home/c/anaconda3/lib/python35.zip:""/home/c/anaconda3/lib/python3.5:""/home/c/anaconda3/lib/python3.5/plat-linux:""/home/c/anaconda3/lib/python3.5/lib-dynload:""/home/c/anaconda3/lib/python3.5/site-packages:""/home/c/anaconda3/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg:""/home/c/anaconda3/lib/python3.5/site-packages/Sphinx-1.4.6-py3.5.egg");
Ответ Томаса помог мне. Я добавил несколько других вариантов в похожий пост:
https://stackoverflow.com/a/46922332/8828614
В посте, на который вы ссылались, был частичный ответ.
Вариант 1. Запустите вашу программу следующим образом
LD_LIBRARY_PATH = / path_to_anaconda / lib ./program
Вариант 2: выполните следующую команду в терминале, затем запустите
программаэкспорт LD_LIBRARY_PATH = / path_to_anaconda / lib ./program
Вариант 3: Добавьте следующую строку в конец вашего .bashrc файла
LD_LIBRARY_PATH = / path_to_anaconda / Библиотека
Почему вы должны делать это при встраивании Python, а не при запуске
переводчик нормально? Понятия не имею, но если какой-нибудь мастер Python / C
натыкаюсь на этот пост, я хотел бы знать, почему.