博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python - Linux C调用Python 函数
阅读量:5013 次
发布时间:2019-06-12

本文共 2474 字,大约阅读时间需要 8 分钟。

1.Python脚本,名称为py_add.py

1 def add(a=1,b=1):2     print('Function of python called!')3     print('a = ',a)4     print('b = ',b)5     print('a + b = ',a+b)

2.C代码

1 #include 
2 #include
3 #include
4 5 int main(int argc,char **argv){ 6 //初始化,载入python的扩展模块 7 Py_Initialize(); 8 //判断初始化是否成功 9 if(!Py_IsInitialized()){10 printf("Python init failed!\n");11 return -1;12 }13 //PyRun_SimpleString 为宏,执行一段python代码14 //导入当前路径15 PyRun_SimpleString("import sys");16 PyRun_SimpleString("sys.path.append('./')");17 18 PyObject *pName = NULL;19 PyObject *pModule = NULL;20 PyObject *pDict = NULL;21 PyObject *pFunc = NULL;22 PyObject *pArgs = NULL;23 24 //加载名为py_add的python脚本25 pName = PyString_FromString("py_add");26 pModule = PyImport_Import(pName);27 if(!pModule){28 printf("Load py_add.py failed!\n");29 getchar();30 return -1;31 }32 pDict = PyModule_GetDict(pModule);33 if(!pDict){34 printf("Can't find dict in py_add!\n");35 return -1;36 }37 pFunc = PyDict_GetItemString(pDict,"add");38 if(!pFunc || !PyCallable_Check(pFunc)){39 printf("Can't find function!\n");40 getchar();41 return -1;42 }43 /*44 向Python传参数是以元组(tuple)的方式传过去的,45 因此我们实际上就是构造一个合适的Python元组就46 可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数47 */48 pArgs = PyTuple_New(2);49 // PyObject* Py_BuildValue(char *format, ...) 50 // 把C++的变量转换成一个Python对象。当需要从 51 // C++传递变量到Python时,就会使用这个函数。此函数 52 // 有点类似C的printf,但格式不同。常用的格式有 53 // s 表示字符串, 54 // i 表示整型变量, 如Py_BuildValue("ii",123,456)55 // f 表示浮点数, 56 // O 表示一个Python对象57 PyTuple_SetItem(pArgs,0,Py_BuildValue("i",123));58 PyTuple_SetItem(pArgs,1,Py_BuildValue("i",321));59 //调用python的add函数60 PyObject_CallObject(pFunc,pArgs);61 //清理python对象62 if(pName){63 Py_DECREF(pName);64 }65 if(pArgs){66 Py_DECREF(pArgs);67 }68 if(pModule){69 Py_DECREF(pModule);70 }71 //关闭python调用72 Py_Finalize();73 return 0;74 }

3,编译

gcc -I/usr/include/python2.7/  mian.c -o main -L/usr/lib/ -lpython2.7

备注:链接Python的库需在最后,否则可能会出现以下的错误提示:

undefined reference to 'Py_Initialize'

4,运行结果

 

转载于:https://www.cnblogs.com/jikexianfeng/p/9173403.html

你可能感兴趣的文章
EasyUI datagrid 的多条件查询
查看>>
Mac升级bash到最新版本
查看>>
利用vagrant打包系统--制作自己的box
查看>>
美女与硬币问题
查看>>
计算几何算法概览 (转)
查看>>
Notepad++的ftp远程编辑功能
查看>>
数据库多对多关联表(Python&MySQL)
查看>>
[实变函数]1.2 集合的运算
查看>>
第06天
查看>>
设计模式的征途—5.原型(Prototype)模式
查看>>
iOS10 app连接不上网络的问题
查看>>
结对开发之电梯调度最终稿(徐梦迪&刘博)
查看>>
simple java mail
查看>>
信息建模
查看>>
Mybatis 数据库物理分页插件 PageHelper
查看>>
虚函数、纯虚函数详解
查看>>
z-stack中数据的发送,广播、组播、点对点
查看>>
Practial Vim 学习笔记一
查看>>
.NET中使用js实现百度搜索下拉提示效果[不是局部刷新,呜呜。。]
查看>>
ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
查看>>