环境: ubuntu1404, python3.4.3
- 首先安装对应python不同版本的调用库: sudo apt-get install python3.4-dev,
- python脚本基本不用变,在C++程序中加入以下改变:
首先#inlcude "Python.h" Py_Initialize();//对python进行初始化,无返回值。使用py_IsInitialized检查系统是否初始化成功。 PyRun_SimpleString("import sys");//sys模块包含了与Python解释器和它的环境有关的函数。 PyRun_SimpleString("sys.path.append('./')");//添加模块路径,其中PyRun_SimpleString表示执行一段Python代码返回0表示成功,-1表示有错。 PyObject *pModule= PyUnicode_FromFormat("new");//载入python脚本 pFunc= PyObject_GetAttrString(pModule, "add"); //这里是要调用的函数名 if(!pFunc|| !PyCallable_Check(pFunc)) {printf("can't find function [add]");getchar();return -1;}//检查是否找到该函数 ------------------------------------------------------------------------------------- 创建参数: PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数 PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号 i表示创建int型变量 PyTuple_SetItem(pArgs, 1, Py_BuildValue("f", 2.5));//1---序号 f表示创建float型变量 //常用的格式有s 表示字符串,i 表示整型变量,f 表示浮点数,O 表示一个Python对象。 PyObject *pDict = PyDict_New(); //创建字典类型变量 PyDict_SetItemString(pDict,"Name", Py_BuildValue("s", "ww"));//往字典类型变量中填充数据 PyDict_SetItemString(pDict,"Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据 PyTuple_SetItem(pArgs, 0, pDict);//0---序号 将字典类型变量添加到参数元组中 -------------------------------------------------------------------------------------- //调用Python函数及其参数 PyObject_CallObject(pFunc, pArgs);//无返回值时 PyObject *pReturn = NULL; //当需要返回值时 pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数 int result; PyArg_Parse(pReturn, "i", &result); //i表示转换成int型变量 cout << "pFunc=" << result << endl; ----------------------------------------------------------------------------------- 以上两部分也可用PyRun_SimpleString直接执行python函数并传入参数如下: PyRun_SimpleString("import new");//此方法无返回值,因为PyRun_SimpleString只返回0或1 PyRun_SimpleString("new.add(3,4)"); PyRun_SimpleString("new.foo(4)"); Py_Finalize();// 关闭Python
- 直接在命令行运行C++代码: g++ python.cpp -o python -I/usr/include/python3.4 -L/usr/lib/python3.4 -lpython3.4m,其中-I(大写i)编译程序按照-I指定的路进去搜索头文件;-L参数跟着的是库文件所在的目录名;-l(小写L)参数就是用来指定程序要链接的库,后面是python的库名;编译程序到系统默认路进搜索,如果找不到,到当前目录,如果当前目录找不到,则到LD_LIBRARY_PATH等环境变量置顶的路进去查找,如果还找不到,那么编译程序提示找不到库。
- 使用CMake编译,在CMakeLists.txt中添加以下代码:
cmake_minimum_required( VERSION 2.8 ) project(CtoPY) IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Release) ENDIF() set( CMAKE_CXX_FLAGS "-std=c++11" ) include_directories(/usr/include/python3.4)#添加头文件目录,相当于g++ -I参数 link_directories(/usr/lib/python3.4)#动态链接库或静态链接库的搜索路径,相当于gcc的-L参数 add_executable(python python.cc)#生成可执行文件 target_link_libraries(python python3.4m)#添加链接库,相同于指定gcc -l参数