python - Linux C调用Python 函数
1.Python脚本,名称为py_add.py
def add(a=,b=):
print('Function of python called!')
print('a = ',a)
print('b = ',b)
print('a + b = ',a+b)
2.C代码
#include <stdio.h>
#include <stdlib.h>
#include <Python.h> int main(int argc,char **argv){
//初始化,载入python的扩展模块
Py_Initialize();
//判断初始化是否成功
if(!Py_IsInitialized()){
printf("Python init failed!\n");
return -;
}
//PyRun_SimpleString 为宏,执行一段python代码
//导入当前路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')"); PyObject *pName = NULL;
PyObject *pModule = NULL;
PyObject *pDict = NULL;
PyObject *pFunc = NULL;
PyObject *pArgs = NULL; //加载名为py_add的python脚本
pName = PyString_FromString("py_add");
pModule = PyImport_Import(pName);
if(!pModule){
printf("Load py_add.py failed!\n");
getchar();
return -;
}
pDict = PyModule_GetDict(pModule);
if(!pDict){
printf("Can't find dict in py_add!\n");
return -;
}
pFunc = PyDict_GetItemString(pDict,"add");
if(!pFunc || !PyCallable_Check(pFunc)){
printf("Can't find function!\n");
getchar();
return -;
}
/*
向Python传参数是以元组(tuple)的方式传过去的,
因此我们实际上就是构造一个合适的Python元组就
可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
*/
pArgs = PyTuple_New();
// PyObject* Py_BuildValue(char *format, ...)
// 把C++的变量转换成一个Python对象。当需要从
// C++传递变量到Python时,就会使用这个函数。此函数
// 有点类似C的printf,但格式不同。常用的格式有
// s 表示字符串,
// i 表示整型变量, 如Py_BuildValue("ii",123,456)
// f 表示浮点数,
// O 表示一个Python对象
PyTuple_SetItem(pArgs,,Py_BuildValue("i",));
PyTuple_SetItem(pArgs,,Py_BuildValue("i",));
//调用python的add函数
PyObject_CallObject(pFunc,pArgs);
//清理python对象
if(pName){
Py_DECREF(pName);
}
if(pArgs){
Py_DECREF(pArgs);
}
if(pModule){
Py_DECREF(pModule);
}
//关闭python调用
Py_Finalize();
return ;
}
3,编译
gcc -I/usr/include/python2./ mian.c -o main -L/usr/lib/ -lpython2.
备注:链接Python的库需在最后,否则可能会出现以下的错误提示:
undefined reference to 'Py_Initialize'
4,运行结果

python - Linux C调用Python 函数的更多相关文章
- linux c 调用 python
/* *gcc -o callpy callpy.cpp -I/usr/include/python3.5 -lpython3.5m */ #include <Python.h> #inc ...
- Python 使用ctypes调用 C 函数
在python中通过ctypes可以直接调用c的函数,非常简单易用 下面就一步一步解释用法吧,以Linux为例讲解. 1, 首先确定你的python支持不支持ctypes python2.7以后cty ...
- [Python]linux自己定义Python脚本命令
在window下写好的程序配置到Linux上,要实现随意文件夹下的命令调用. 因为初学Linux,这里从文件传输等最主要的方法入手,记录配置的过程中遇到的各种问题. 连接远端server 这里使用pu ...
- python学习:调用其他函数
vim wc.py #!/usr/bin/python def wordCount(s): chars = len(s) words = len(s.split()) ...
- python网络编程调用recv函数完整接收数据的三种方法
最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...
- 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...
- python调用C函数
python 与 c可以相互调用,在做后台服务时底层服务用C/C++编写,通过python调用C库可以极大的提高开发效率. 下面对几种调用方式举例说明 1 python通过指针传递浮点型数组给C函数 ...
- R 调用 python
上一篇说了python使用 rpy2 调用 R,这里介绍R如何调用python.R的强项在于统计方面,尤其是专业的统计分析,统计检验以及作图功能十分强大,但是在通用性方面,就远不如Python了,比如 ...
- 通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
随机推荐
- numpy 用于图像处理
1. 转换为灰度图 灰度图的数据可以看成是二维数组,元素取值为0 ~ 255,其中,0为黑色,255为白色.从0到255逐渐由暗色变为亮色. 灰度图转换(ITU-R 601-2亮度变换): L = R ...
- Python并发复习4- concurrent.futures模块(线程池和进程池)
Python标准库为我们提供了threading(多线程模块)和multiprocessing(多进程模块).从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提 ...
- 实现DataGridView控件中CheckBox列的使用
最近做WindowsForms程序,使用DataGridView控件时,加了一列做选择用,发现CheckBox不能选中.搜索后,要实现DataGridView的CellContentClick事件,将 ...
- linux 硬盘分区与格式化挂载 (二)
1. 文件系统的挂载与卸载(详见linux系统管理P406)1) 掌握挂载的定义:挂载指将一个设备(通常是存储设备)挂接到一个已存在的目录上.2) 掌握mount命令的功能:实现文件系统的挂载.3) ...
- 虚拟主机的IIS连接数和访问流量限制各是什么
网址:http://zhidao.baidu.com/question/40279863IIS连接数,就是你的网站同时允许多少个人连接你的网站.IIS连接数为100就是,同时允许100人连接你的网站, ...
- GCD 与 LCM UVA - 11388
题目链接: https://cn.vjudge.net/problem/23709/origin 本题其实有坑 数据大小太大, 2的32次方,故而一定是取巧的算法,暴力不可能过的 思路是最大公因数的倍 ...
- Java笔记(十九) 反射
反射 反射是在运行时获取类型的信息,再根据这些信息进行操作. 一.Class类 每个已加载的类在内存中都有一份类信息,每个对象都有指向它的类信息的引用. 在Java中,类信息对应的类就是java.la ...
- Vue子页面给父页面传递数据
子页面: <template> <div> <p>子组件</p> <button @click="sendMsg">传递 ...
- 1. cs231n k近邻和线性分类器 Image Classification
第一节课大部分都是废话.第二节课的前面也都是废话. First classifier: Nearest Neighbor Classifier 在一定时间,我记住了输入的所有的图片.在再次输入一个图片 ...
- python之类
1 初始类 1 声明类 (和声明函数很相似) 类的定义格式 class 类名: '类的文档字符串' 类体 2 创建一个类: class Data: pass Python编程中习惯类名使用单数单词并且 ...