如何实现Python调用C代码--python与C之间如何通信(swig)
转载: https://www.zhihu.com/question/23003213
1. C代码如何调用Python
1.1 test
#include <Python.h> int main(int argc, char *argv[]) {Py_SetProgramName(argv[0]);Py_Initialize(); PyRun_SimpleString("print ('Hello Python!')\n");Py_Finalize();return 0;}
Linux下执行:
gcc -Wall cpython01.c -o cpython01.out -I/usr/include/python2.7 -lpython2.7
注意是Python2.7不是python3...不然好像报错....
1.2 C调用Python函数
great_module.py
#!/usr/bin/python3 #-*- coding:utf-8 -*- def great_function(a):return a + 1
include_module_from_py.c
#include <stdio.h> #include <Python.h> int include_module_from_py(int a) {int res = 0;PyObject *pModule, *pFunc;PyObject *pArgs, *pValue;//import great_module.py pModule = PyImport_Import(PyString_FromString("great_module")); ////great_module.great_function(args)pFunc = PyObject_GetAttrString(pModule, "great_function");//build argspArgs = PyTuple_New(1); //Pyxxx_new录创建类型为xxx的变量PyTuple_SetItem(pArgs, 0, PyInt_FromLong(a)); //若a为tuple, 则a[i]=b对应于 PyTuple_SetItem(a, i, b)//callpValue = PyObject_CallObject(pFunc, pArgs);res = PyInt_AsLong(pValue); return res; }int main() {Py_Initialize();printf("res = %d\n", include_module_from_py(3));Py_Finalize();return 0; }
运行时,需要先:
export PYTHONPATH=.:$PYTHONPATH
编译:
gcc -Wall include_module_from_py.c -o include_module.out -I/usr/include/python2.7 -lpython2.7
2. python调用C/C++
great_module.c
#include <stdio.h> #include <Python.h> int great_function(int a) {return a + 1; }static PyObject * _great_function(PyObject *self, PyObject *args) {int _a; int res;//负责将Python的参数转换为C的参数if (!PyArg_ParseTuple(args, "i", &_a)){ return NULL;} res = great_function(_a);return PyLong_FromLong(res);}//导出表, 负责告诉Python这个模块有哪些函数可以被Python调用 static PyMethodDef GreateModuleMethods[] = { { "great_function", // 函数名_great_function, // 包裹函数METH_VARARGS, // 参数变长 "" // 说明性文字}, { NULL, NULL, 0, NULL } //总是如此 };//导出函数, 名字: module名称+前缀init PyMODINIT_FUNC initgreat_module() {(void) Py_InitModule("great_module", GreateModuleMethods); }
gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7 -lpython2.7
3. ctypes: Python调用C
#include <stdio.h> int add_int(int a, int b) {return a + b; }double add_double(double a, double b) {return a + b; }
gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c
#!/usr/bin/python3 #-*- coding:utf-8 -*-from ctypes import *adder = CDLL('./adder.so')res_int = adder.add_int(4, 5) print("4 + 5 = %d " % (res_int))a = c_double(5.5) b = c_double(4.1)add_double = adder.add_double add_double.restype = c_double print("5.5 + 4.1 = ", str(add_double(a, b)))
工作中用了之后, 想想看还是用ctypes方便点....工程生成.so动态链接库, 然后直接在Python里导入.
最好是在C代码中, 将需要的功能接口写的易调用点!! 然后Python也不需要传很多的参数, 直接获取一个结果等等...
4. 使用SWIG使Python调用C/C++
example.h
#include <iostream> using namespace std;class Example {public:void say_hello();};
example.cpp
#include "example.h"void Example::say_hello() {cout << "hello\n"; }
example.i
%module example %{ #include "example.h" %} %include "example.h"
setup.py
#!/usr/bin/python3 #-*- coding:utf-8 -*-""" setup.py file for SWIG C\+\+/Python example """ from distutils.core import setup, Extensionexample_module = Extension('_example',sources=['example.cpp', 'example_wrap.cxx',], )setup (name = 'example',version = '0.1',author = "douzi",description = """Simple swig C\+\+/Python example""",ext_modules = [example_module],py_modules = ["example"], )
然后使用:
swig -c\+\+ -python example.i python3 setup.py build_ext --inplace
https://blog.csdn.net/gxt_gy/article/details/50341215
转载于:https://www.cnblogs.com/douzujun/p/10738959.html
如何实现Python调用C代码--python与C之间如何通信(swig)相关推荐
- Python调用Java代码部署及初步使用
Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...
- python调用java代码方法
前言: 公司要测试对外接口,接口中的数据又涉及到加密的问题,而python对加密数据进行位运算后,居然无法逆向位运算回来了(应该是个人能力不够吧),只好调用同事之前用的java代码中的函数去解码了,花 ...
- python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解
前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...
- python调用opencv代码_Python调用OpenCV实现图像平滑代码实例
主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波.方框滤波.高斯滤波和中值滤波. 给图像增加噪声: import cv2 import numpy as np def test ...
- python调用c代码
Linux环境下使用python调用C的printf例子: #!/usr/bin/env python2.7 #-*- coding:utf-8 -*- from ctypes import * de ...
- python调用shell命令-python调用shell命令小结
在写python脚本的时候,经常需要调用系统命令,常用的python调用系统命令的方法主要有subprocess.call和os.popen.默认情况下subprocess.call的方法结果是返回值 ...
- python脚本中执行另一个脚本_如何用python调用另一个python脚本?
如果想要将已经设置好的内容,在转移到另一个位置要怎么做呢?小编能写到的方法有,照抄,复制,以及转移使用.在我们日常办公上是非常好理解的,就是ctr v,但是如果想在编程上,将某一位置拿去到别的项目上使 ...
- python调用lib_基于python调用libvirt API
基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...
- python入门经典代码-python经典入门学习锦集就这篇够了,强烈建议收藏!
原标题:python经典入门学习锦集就这篇够了,强烈建议收藏! Python 简介 Python 是一种高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 由 Guido van ...
最新文章
- VB100年底测试:McAfee金山遗憾出局 瑞星表现令人意外
- Swoole入门指南:PHP7安装Swoole详细教程(一)
- element-ui如何进行调试
- telnet入侵linux,教你入侵RedHatLinux
- javascript实现的一个信息提示的小功能/
- plantUml活动图(新语法)
- 马哥Linux2016最新高薪运维视频课程
- vs不能调试_20200717调试记录(五十四)
- [转]使用Hyper-V BPA(Best Practices Analyzer-最佳化分析工具)
- Devcpp(Dev-C++)代码编辑的快捷键
- 微信小程序开发教程:WeUI一个专为微信小程序设计的UI框架
- 在Arduino和ESP32-s2环境下,测试WiFi Fine Time Measurement (FTM) Round Trip Time (RTT) 的定位和测距
- 把脉大连接:“多端协同”的大动脉与“多人协作”的主动脉
- java增大字體_往JRE里增加字体
- 前端自学日记-day5
- java word插件开发_java生成word的几种方案
- 您计算机处于状态或者您计算机时钟设置,您的Windows 10时间不正确? 这是如何固定时钟 | MOS86...
- 创业起步?先收藏这份终极指南
- 龚文祥:VC看B2C的5个核心数据
- 中职计算机应用专业课堂教学,谈谈中职计算机应用基础课程教学中翻转课堂研究...
热门文章
- Codeforces 446C. DZY Loves Fibonacci Numbers【斐波那契+线段树】
- 自己写一个java.lang.reflect.Proxy代理的实现
- Information Retrieval --- Outline
- Objective-C超高精度的计时器
- 卡莱特led显示屏调试教程_镇康室内LED显示屏型号
- 桌面时钟代码_被遗忘的手机桌面小部件
- Hadoop系列-HDFS HA高可用集群
- (54)FPGA基础编码D触发器(三)
- (78)FPGA内部资源与FPGA开发流程-面试必问(二)(第16天)
- (97)FPGA DCM与PMCD区别?