linux C++调用python3的程序

环境: ubuntu1404,  python3.4.3

  1. 首先安装对应python不同版本的调用库: sudo apt-get install  python3.4-dev,
  2. 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
  3. 直接在命令行运行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等环境变量置顶的路进去查找,如果还找不到,那么编译程序提示找不到库。
  4. 使用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参数

     

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值