织梦CMS - 轻松建站从此开始!

罗索

C/C++调用Python

jackyhwei 发布于 2020-05-05 23:14 点击:次 
C++可以调用Python脚本,那么就可以写一些Python的脚本接口供C++调用了,至少可以把Python当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口。缺点是C++的程序一旦编译好了
TAG: C调用Python  

C++可以调用Python脚本,那么就可以写一些Python的脚本接口供C++调用了,至少可以把Python当成文本形式的动态链接库, 
需要的时候还可以改一改,只要不改变接口。缺点是C++的程序一旦编译好了,再改就没那么方便了。
(1)Python脚本:pytest.py

  1. #test function   
  2. def add(a,b):   
  3.     print "in python function add"   
  4.     print "a = " + str(a)   
  5.     print "b = " + str(b)   
  6.     print "ret = " + str(a+b)   
  7.     return   
  8.    
  9. def foo(a):   
  10.    
  11.     print "in python function foo"   
  12.     print "a = " + str(a)   
  13.     print "ret = " + str(a * a)   
  14.     return    
  15.    
  16. class guestlist:   
  17.     def __init__(self):   
  18.         print "aaaa"   
  19.     def p():   
  20.       print "bbbbb"   
  21.     def __getitem__(self, id):   
  22.       return "ccccc"   
  23. def update():   
  24.     guest = guestlist()   
  25.     print guest['aa']   
  26.    
  27. #update() 

(2)C++代码:

  1. /**g++ -o callpy callpy.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config -lpython2.6**/   
  2. #include <Python.h>   
  3. int main(int argc, char** argv)   
  4. {   
  5.     // 初始化Python   
  6.     //在使用Python系统前,必须使用Py_Initialize对其   
  7.     //进行初始化。它会载入Python的内建模块并添加系统路   
  8.     //径到模块搜索路径中。这个函数没有返回值,检查系统   
  9.     //是否初始化成功需要使用Py_IsInitialized。   
  10.     Py_Initialize();   
  11.    
  12.     // 检查初始化是否成功   
  13.     if ( !Py_IsInitialized() ) {   
  14.         return -1;   
  15.     }   
  16.     // 添加当前路径   
  17.     //把输入的字符串作为Python代码直接运行,返回0   
  18.     //表示成功,-1表示有错。大多时候错误都是因为字符串   
  19.     //中有语法错误。   
  20.     PyRun_SimpleString("import sys");   
  21.     PyRun_SimpleString("print '---import sys---'");    
  22.     PyRun_SimpleString("sys.path.append('./')");   
  23.     PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;   
  24.    
  25.     // 载入名为pytest的脚本   
  26.     pName = PyString_FromString("pytest");   
  27.     pModule = PyImport_Import(pName);   
  28.     if ( !pModule ) {   
  29.         printf("can't find pytest.py");   
  30.         getchar();   
  31.         return -1;   
  32.     }   
  33.     pDict = PyModule_GetDict(pModule);   
  34.     if ( !pDict ) {   
  35.         return -1;   
  36.     }   
  37.    
  38.     // 找出函数名为add的函数   
  39.     printf("----------------------\n");   
  40.     pFunc = PyDict_GetItemString(pDict, "add");   
  41.     if ( !pFunc || !PyCallable_Check(pFunc) ) {   
  42.         printf("can't find function [add]");   
  43.         getchar();   
  44.         return -1;   
  45.      }   
  46.    
  47.     // 参数进栈   
  48.     *pArgs;   
  49.     pArgs = PyTuple_New(2);   
  50.    
  51.     //  PyObject* Py_BuildValue(char *format, ...)   
  52.     //  把C++的变量转换成一个Python对象。当需要从   
  53.     //  C++传递变量到Python时,就会使用这个函数。此函数   
  54.     //  有点类似C的printf,但格式不同。常用的格式有   
  55.     //  s 表示字符串,   
  56.     //  i 表示整型变量,   
  57.     //  f 表示浮点数,   
  58.     //  O 表示一个Python对象。   
  59.    
  60.     PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));   
  61.     PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));   
  62.    
  63.     // 调用Python函数   
  64.     PyObject_CallObject(pFunc, pArgs);   
  65.    
  66.     //下面这段是查找函数foo 并执行foo   
  67.     printf("----------------------\n");   
  68.     pFunc = PyDict_GetItemString(pDict, "foo");   
  69.     if ( !pFunc || !PyCallable_Check(pFunc) ) {   
  70.         printf("can't find function [foo]");   
  71.         getchar();   
  72.         return -1;   
  73.      }   
  74.    
  75.     pArgs = PyTuple_New(1);   
  76.     PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2));    
  77.    
  78.     PyObject_CallObject(pFunc, pArgs);   
  79.         
  80.     printf("----------------------\n");   
  81.     pFunc = PyDict_GetItemString(pDict, "update");   
  82.     if ( !pFunc || !PyCallable_Check(pFunc) ) {   
  83.         printf("can't find function [update]");   
  84.         getchar();   
  85.         return -1;   
  86.      }   
  87.     pArgs = PyTuple_New(0);   
  88.     PyTuple_SetItem(pArgs, 0, Py_BuildValue(""));   
  89.     PyObject_CallObject(pFunc, pArgs);        
  90.    
  91.     Py_DECREF(pName);   
  92.     Py_DECREF(pArgs);   
  93.     Py_DECREF(pModule);   
  94.    
  95.     // 关闭Python   
  96.     Py_Finalize();   
  97.     return 0;   

(3)C++编译成二进制可执行文件:g++ -o callpy callpy.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config -lpython2.6,编译选项需要手动指定Python的include路径和链接接路径(Python版本号根据具体情况而定)。

(4)运行结果:

 

(yanzi-meng)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/202005/17664.html]
本文出处:博客园 作者:yanzi-meng 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容