C++ 在c+中嵌入python+;:选择python版本

C++ 在c+中嵌入python+;:选择python版本,c++,macos,python-2.7,embedding,anaconda,C++,Macos,Python 2.7,Embedding,Anaconda,我已经为我的问题寻找了很长一段时间的答案,但我找到的答案似乎都不能解决我的问题 我试图用Python(Python .h,pyxxxx函数等)提供的函数在我的C++代码中嵌入Python。但是,在让我的C++程序调用正确的Python解释器时,我遇到了麻烦。事实上,我的机器上有几个解释器(顺便说一下,这是一台运行OSX 10.7.5的Mac)。我在操作系统中预装了Python的默认版本(2.7.1版),anaconda安装了另一个版本(2.7.7版)。我需要使用anaconda安装的版本,因为我

我已经为我的问题寻找了很长一段时间的答案,但我找到的答案似乎都不能解决我的问题

我试图用Python(Python .h,pyxxxx函数等)提供的函数在我的C++代码中嵌入Python。但是,在让我的C++程序调用正确的Python解释器时,我遇到了麻烦。事实上,我的机器上有几个解释器(顺便说一下,这是一台运行OSX 10.7.5的Mac)。我在操作系统中预装了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)]
然而,当我在终端中运行anaconda的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
以及使用默认的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指定的路径没有指向正确的可执行文件

非常感谢你的帮助


亚历克斯

我也遇到过同样的问题。我的解决方案是这样调用程序:

DYLD\u LIBRARY\u PATH=/PATH\u to\u anaconda/lib./program

这是因为运行时使用的共享库是从错误的原始OSX目录加载的。 (linux中的LD_LIBRARY_PATH)

使用“导入操作系统”和“打印(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");

托马斯提供的答案帮助了我。我在一篇类似的文章中添加了一些其他选项:

你链接的帖子中有部分答案

选项1:按如下方式运行程序

LD_LIBRARY_PATH=/PATH_to_anaconda/lib./program

选项2:在终端中运行以下命令,然后运行 节目

导出LD_LIBRARY_PATH=/PATH_到_anaconda/lib./program

选项3:在.bashrc文件末尾添加以下行

LD_LIBRARY_PATH=/PATH_to_anaconda/lib

为什么在嵌入python时必须这样做,而在运行python时却不必这样做 翻译正常吗?我不知道,但是如果一些Python/C向导 偶然发现这篇文章,我想知道为什么


针对哪种Python编译不是更重要吗?你用什么命令来编译?下面是我如何编译
g++-fno严格别名-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脚本包:…
。但它也没有任何效果。你是对的,我在这里引用了我在那篇文章中的答案