macos — встроить Python в C ++: выбрать версию Python

Я долго искал ответ на свой вопрос, но ни один из тех, что я нашел, похоже, не решил мою проблему.

Я пытаюсь встроить 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

2

Решение

Я испытал ту же проблему. Решением для меня было вызвать программу так:

DYLD_LIBRARY_PATH=/path_to_anaconda/lib ./program

Это потому, что общие библиотеки, используемые во время выполнения, были загружены из неправильного, оригинального каталога OSX.
(LD_LIBRARY_PATH в Linux)

2

Другие решения

Используйте «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");
0

Ответ Томаса помог мне. Я добавил несколько других вариантов в похожий пост:

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
натыкаюсь на этот пост, я хотел бы знать, почему.

-1
По вопросам рекламы [email protected]