当前位置: 首页 > news >正文

python - Linux C调用Python 函数

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 <stdio.h>
 2 #include <stdlib.h>
 3 #include <Python.h>
 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

相关文章:

  • IIS 7 应用程序池自动回收关闭的解决方案
  • FullScreenPopNavigationController
  • tp5多条件查询
  • 本地电脑与远程服务器之间不能复制粘贴解决方法
  • 八 原型prototype和__proto__
  • SQL存储过程解密
  • 数据库可视化工具简介以及pymysql的使用
  • Mysql-慢查询日志
  • ztree异步加载树节点
  • 分页插件PageHelper配置步骤(mybatis)
  • 快速排序的C++版
  • 新建存过,查询表结构的方法。
  • 金额转换问题
  • jquery-5 jQuery筛选选择器
  • kettle学习笔记(九)——子转换、集群与变量
  • SegmentFault for Android 3.0 发布
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【知识碎片】第三方登录弹窗效果
  • CentOS 7 防火墙操作
  • Intervention/image 图片处理扩展包的安装和使用
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 讲清楚之javascript作用域
  • 模型微调
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 树莓派 - 使用须知
  • 微信小程序填坑清单
  • 学习笔记:对象,原型和继承(1)
  • NLPIR智能语义技术让大数据挖掘更简单
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​iOS实时查看App运行日志
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • (Forward) Music Player: From UI Proposal to Code
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (学习日记)2024.01.19
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)c++ std::pair 与 std::make
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net 4.0并行库实用性演练
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net的DataSet直接与SQL2005交互
  • /etc/skel 目录作用
  • @SentinelResource详解
  • [ IO.File ] FileSystemWatcher
  • [1127]图形打印 sdutOJ
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android]如何调试Native memory crash issue
  • [ANT] 项目中应用ANT
  • [ARM]ldr 和 adr 伪指令的区别
  • [BUUCTF]-Reverse:reverse3解析
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析