python3.5 c++ 调用 python 代码

c++ 调用python的过程:

  1. 初始化Python调用环境
  2. 加载对应的Python模块
  3. 加载对应的Python函数
  4. 将参数转化为Python元组类型
  5. 调用Python函数并传入参数元组
  6. 获取返回值
  7. 根据Python函数的定义解析返回值

环境:

      ubuntu 系统:Linux lei-virtual-machine 4.15.0-30-generic #32~16.04.1-Ubuntu SMP Thu Jul 26 20:25:39 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

       python 是用的3.5版本的

既然是c++ 调用python 肯定会有两个文件:

首先:

pytest.py

#test function  
def add(a,b):  
    print("in python function add")  
    print("a = " + str(a))  
    print("b = " + str(b))  
    print("ret = " + str(a+b))  
    return  
  
def foo(a):  
  
    print ("in python function foo")  
    print ("a = " + str(a))  
    print ("ret = " + str(a * a))  
    return   
  
class guestlist:  
    def __init__(self):  
        print("aaaa")  
    def p():  
      print("bbbbb")  
    def __getitem__(self, id):  
      return "ccccc"  
def update():  
    guest = guestlist()  
    print(guest['aa'])  
  
#update()

callpy.cpp


/**g++ -o callpy callpy.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config -lpython2.6**/  
#include <Python.h>  
int main(int argc, char** argv)  
{  
    // 初始化Python  
    //在使用Python系统前,必须使用Py_Initialize对其  
    //进行初始化。它会载入Python的内建模块并添加系统路  
    //径到模块搜索路径中。这个函数没有返回值,检查系统  
    //是否初始化成功需要使用Py_IsInitialized。  
    Py_Initialize();  
  
    // 检查初始化是否成功  
    if ( !Py_IsInitialized() ) {  
        return -1;  
    }  
    // 添加当前路径  
    //把输入的字符串作为Python代码直接运行,返回0  
    //表示成功,-1表示有错。大多时候错误都是因为字符串  
    //中有语法错误。  
    PyRun_SimpleString("import sys");  
    PyRun_SimpleString("print('---import sys---')");   
    PyRun_SimpleString("sys.path.append('./')");  
    PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;  
  
    // 载入名为pytest的脚本  
    //pName = PyString_FromString("pytest");  
    pModule = PyImport_ImportModule("pytest");  
    if ( !pModule ) {  
        printf("can't find pytest.py");  
        getchar();  
        return -1;  
    }  
    pDict = PyModule_GetDict(pModule);  
    if ( !pDict ) {  
        return -1;  
    }  
  
    // 找出函数名为add的函数  
    printf("----------------------\n");  
    pFunc = PyDict_GetItemString(pDict, "add");  
    if ( !pFunc || !PyCallable_Check(pFunc) ) {  
        printf("can't find function [add]");  
        getchar();  
        return -1;  
     }  
  
    // 参数进栈  
    *pArgs;  
    pArgs = PyTuple_New(2);  
  
    //  PyObject* Py_BuildValue(char *format, ...)  
    //  把C++的变量转换成一个Python对象。当需要从  
    //  C++传递变量到Python时,就会使用这个函数。此函数  
    //  有点类似C的printf,但格式不同。常用的格式有  
    //  s 表示字符串,  
    //  i 表示整型变量,  
    //  f 表示浮点数,  
    //  O 表示一个Python对象。  
  
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));  
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));  
  
    // 调用Python函数  
    PyObject_CallObject(pFunc, pArgs);  
  
    //下面这段是查找函数foo 并执行foo  
    printf("----------------------\n");  
    pFunc = PyDict_GetItemString(pDict, "foo");  
    if ( !pFunc || !PyCallable_Check(pFunc) ) {  
        printf("can't find function [foo]");  
        getchar();  
        return -1;  
     }  
  
    pArgs = PyTuple_New(1);  
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2));   
  
    PyObject_CallObject(pFunc, pArgs);  
       
    printf("----------------------\n");  
    //pFunc = PyDict_GetItemString(pDict, "update");  
    //if ( !pFunc || !PyCallable_Check(pFunc) ) {  
    //    printf("can't find function [update]");  
    //    getchar();  
    //    return -1;  
    // }  
    //pArgs = PyTuple_New(0);  
    //PyTuple_SetItem(pArgs, 0, Py_BuildValue(""));  
    //PyObject_CallObject(pFunc, pArgs);       
  
 //   Py_DECREF(pName);  
   // Py_DECREF(pArgs);  
    //Py_DECREF(pModule);   
    // 关闭Python  
    Py_Finalize();  
    return 0;  
}

 

编译:

g++ -o callpy callpy.cpp -I/usr/include/python3.5 -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu  -lpython3.5 -g
 

结果是:

参考博客:

https://blog.csdn.net/zichen_ziqi/article/details/79068656

http://www.cnblogs.com/lanuage/p/9418431.html

python 和 c  参数类型的传递

https://blog.csdn.net/stu_csdn/article/details/69488385

 

 

 

阅读更多

没有更多推荐了,返回首页