2014-08-29 70 views
2

我一直在寻找我的问题的答案很长一段时间,但没有找到我发现的问题似乎解决了我的问题。在C++中嵌入python:选择python版本

我想通过Python提供的功能(Python.h,Py_xxx函数等)将Python嵌入到我的C++代码中。但是,我在让我的C++程序调用正确的Python解释器方面遇到了麻烦。事实上,我的机器上有几个解释器(顺便说一下,它是运行OSX 10.7.5的Mac)。我已经预装了操作系统(版本2.7.1)的Python的默认版本,并且我有另一个由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)] 

然而,当我在终端运行的水蟒的蟒蛇,这里是我得到

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 2014-08-29 18:50:21

+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:...'。但它也没有任何影响。 – 2014-09-01 07:56:08

回答

1

我遇到过同样的问题。对我来说,解决办法是调用的程序是这样的:

DYLD_LIBRARY_PATH=/path_to_anaconda/lib ./program

这是因为在运行时使用的共享库是从错误的,原来的OSX目录加载。 (在Linux LD_LIBRARY_PATH)

0

使用 “导入OS” 和 “打印(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

托马斯提供的答案帮助了我。我加了一个类似的职位其他几个选项:

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

有你链接的帖子了部分答案。

选项1:运行程序如下

LD_LIBRARY_PATH =/path_to_anaconda/lib中。/程序

选项2:在终端运行下面​​的命令,然后运行 程序

出口LD_LIBRARY_PATH =/path_to_anaconda/lib中./program

方案3:下面的行添加到所述端你的.bashrc文件

LD_LIBRARY_PATH =/path_to_anaconda/lib目录

为什么运行 时,你必须这样做嵌入蟒蛇的时候,却没有解释呃通常?我不知道,但如果一些Python/C向导 在这篇文章中绊倒,我很想知道为什么。

+0

你说得对,我在这里引用了我的回答 – Quintin 2017-10-25 02:15:45