2014-08-29 3 views
2

Я долгое время искал ответ на свой вопрос, но ни один из найденных мной не решил мою проблему.Вставить python в C++: выберите python version

Я пытаюсь встроить Python в свой код на C++ с функциями, предоставляемыми Python (функции Python.h, Py_xxx и т. Д.). Однако у меня возникают проблемы с тем, что моя программа на C++ вызывает правильный интерпретатор Python. Действительно, на моей машине существует несколько интерпретаторов (кстати, это Mac с OSX 10.7.5). У меня есть версия Python по умолчанию, предварительно установленная с ОС (версия 2.7.1), и у меня есть другая версия, установленная anaconda (версия 2.7.7). Мне нужно использовать версию, установленную anaconda, потому что мне нужны дополнительные библиотеки, доступные с anaconda, которые по умолчанию не установлены с помощью Python OSX.

код

Мой 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)] 

Однако, когда я бегу питона Анаконда в терминале, вот что я получаю

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 

И результат с python по умолчанию

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. 

Так кажется, что даже если я задаю другой путь для исполняемого файла, вызывается OSX по умолчанию python (и конфликтует с библиотеками anaconda, которые я пытаюсь импортировать позже).

Мой вопрос таким образом прост: что я делаю неправильно и почему пути, которые я указываю через Py_Setxxx, не указывают на правильный исполняемый файл?

Большое вам спасибо за помощь!

Alex

+1

Не было бы более важным, с чем вы скомпилируете Python? Какую команду вы используете для компиляции? – asmeurer

+0

Вот как я скомпилирую 'g ++ -fno-strict-aliasing -DIL_STD -I/anaconda/include/python2.7 -O3 -g3 -pedantic -Wall -c -fmessage-length = 0' и вот как я связываю' g ++ -ansi -pedantic -DIL_STD -ggdb -m64 -w -g -L/anaconda/lib -lpython2.7'. Это ответ на ваш вопрос? Редактировать: Я также устанавливаю значения PYTHONHOME на '/ anaconda' и PYTHONPATH на' /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: ... '. Но это тоже не имеет никакого эффекта. –

ответ

1

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

DYLD_LIBRARY_PATH=/path_to_anaconda/lib ./program

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

0

Использование "импорт ОС" и "печать (os.sys.path)", чтобы получить питона домой, то:

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"); 
-1

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

https://stackoverflow.com/a/46922332/8828614

Был частичный ответ на почте вы связаны между собой.

Вариант 1: Запустите программу следующим

LD_LIBRARY_PATH =/path_to_anaconda/LIB./ Программа

Вариант 2: Выполните следующую команду в терминале, а затем запустить ваш программа

экспорт LD_LIBRARY_PATH =/path_to_anaconda/Библиотека ./program

Вариант 3: Добавьте следующую строку в конец вашего файла .bashrc

LD_LIBRARY_PATH =/path_to_anaconda/Библиотека

Почему вы должны сделать это при встраивании питона, но не при запуске интерпретировать нормально? Я понятия не имею, но если какой-нибудь мастер Python/C спотыкается на этот пост, я хотел бы знать, почему.

+0

Вы правы, я процитировал свой ответ с этого поста здесь – Quintin

 Смежные вопросы

  • Нет связанных вопросов^_^