python与C、C++混编的四种方式(小结)


Posted in Python onJuly 15, 2019

混编的含义有两种,

一种是在python里面写C

一种是C里面写python

本文主要是进行简化,方便使用。

#####################################################################################################

第一种、Python调用C动态链接库(利用ctypes)

pycall.c

/***gcc -o libpycall.so -shared -fPIC pycall.c*/ 
#include <stdio.h> 
#include <stdlib.h> 
int foo(int a, int b) 
{ 
 printf("you input %d and %d\n", a, b); 
 return a+b; 
}

pycall.py

import ctypes 
ll = ctypes.cdll.LoadLibrary  
lib = ll("./libpycall.so")  
lib.foo(1, 3) 
print '***finish***'

运行方法:

gcc -o libpycall.so -shared -fPIC pycall.c
python pycall.py

第2种、Python调用C++(类)动态链接库(利用ctypes)

pycallclass.cpp

#include <iostream> 
using namespace std; 
 
class TestLib 
{ 
  public: 
    void display(); 
    void display(int a); 
}; 
void TestLib::display() { 
  cout<<"First display"<<endl; 
} 
 
void TestLib::display(int a) { 
  cout<<"Second display:"<<a<<endl; 
} 
extern "C" { 
  TestLib obj; 
  void display() { 
    obj.display();  
   } 
  void display_int() { 
    obj.display(2);  
   } 
}

pycallclass.py

import ctypes 
so = ctypes.cdll.LoadLibrary  
lib = so("./libpycallclass.so")  
print 'display()' 
lib.display() 
print 'display(100)' 
lib.display_int(100)

运行方法:

g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp
python pycallclass.py

第3种、Python调用C和C++可执行程序

main.cpp

#include <iostream> 
using namespace std; 
int test() 
{ 
  int a = 10, b = 5; 
  return a+b; 
} 
int main() 
{ 
  cout<<"---begin---"<<endl; 
  int num = test(); 
  cout<<"num="<<num<<endl; 
  cout<<"---end---"<<endl; 
}

main.py

import commands 
import os 
main = "./testmain" 
if os.path.exists(main): 
  rc, out = commands.getstatusoutput(main) 
  print 'rc = %d, \nout = %s' % (rc, out) 
 
print '*'*10 
f = os.popen(main)  
data = f.readlines()  
f.close()  
print data 
 
print '*'*10 
os.system(main)

运行方法(只有这种不是生成.so然后让python文件来调用):

g++ -o testmain main.cpp
python main.py

第4种、扩展Python(C++为Python编写扩展模块)(超级麻烦的一种)

Extest2.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
int fac(int n) 
{ 
  if (n < 2) return(1); 
  return (n)*fac(n-1); 
} 
 
char *reverse(char *s) 
{ 
  register char t, 
      *p = s, 
      *q = (s + (strlen(s) - 1)); 
 
  while (s && (p < q)) 
  { 
    t = *p; 
    *p++ = *q; 
    *q-- = t; 
  } 
  return(s); 
} 
 
int test() 
{ 
  char s[BUFSIZ]; 
  printf("4! == %d\n", fac(4)); 
  printf("8! == %d\n", fac(8)); 
  printf("12! == %d\n", fac(12)); 
  strcpy(s, "abcdef"); 
  printf("reversing 'abcdef', we get '%s'\n", \ 
    reverse(s)); 
  strcpy(s, "madam"); 
  printf("reversing 'madam', we get '%s'\n", \ 
    reverse(s)); 
  return 0; 
} 
 
#include "Python.h" 
 
static PyObject * 
Extest_fac(PyObject *self, PyObject *args) 
{ 
  int num; 
  if (!PyArg_ParseTuple(args, "i", &num)) 
    return NULL; 
  return (PyObject*)Py_BuildValue("i", fac(num)); 
} 
 
static PyObject * 
Extest_doppel(PyObject *self, PyObject *args) 
{ 
  char *orig_str; 
  char *dupe_str; 
  PyObject* retval; 
 
  if (!PyArg_ParseTuple(args, "s", &orig_str)) 
    return NULL; 
  retval = (PyObject*)Py_BuildValue("ss", orig_str, 
    dupe_str=reverse(strdup(orig_str))); 
  free(dupe_str);       
  return retval; 
} 
 
static PyObject * 
Extest_test(PyObject *self, PyObject *args) 
{ 
  test(); 
  return (PyObject*)Py_BuildValue(""); 
} 
 
static PyMethodDef 
ExtestMethods[] = 
{ 
  { "fac", Extest_fac, METH_VARARGS }, 
  { "doppel", Extest_doppel, METH_VARARGS }, 
  { "test", Extest_test, METH_VARARGS }, 
  { NULL, NULL }, 
}; 
 
void initExtest() 
{ 
  Py_InitModule("Extest", ExtestMethods); 
}

setup.py

#!/usr/bin/env python 
 
from distutils.core import setup, Extension 
 
MOD = 'Extest' 
setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest2.c'])])

运行方法:

python setup.py build
cd build/lib.linux-x86_64-2.7

进入python交互模式>>>

import Extest
Extest.test()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python链接Oracle数据库的方法
Jun 28 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
Python for循环搭配else常见问题解决
Feb 11 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
python安装读取grib库总结(推荐)
Jun 24 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 #Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 #Python
Python将文字转成语音并读出来的实例详解
Jul 15 #Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 #Python
Python符号计算之实现函数极限的方法
Jul 15 #Python
在python 中split()使用多符号分割的例子
Jul 15 #Python
Python-Seaborn热图绘制的实现方法
Jul 15 #Python
You might like
php array_slice函数的使用以及参数详解
2008/08/30 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
php时间戳转换的示例
2014/03/31 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
django数据库自动重连的方法实例
2019/07/21 Python
python怎么对数字进行过滤
2020/07/05 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
新东网科技Java笔试题
2012/07/13 面试题
杭州时比特电子有限公司SQL
2013/08/22 面试题
会计应届生的自荐信
2013/12/13 职场文书
还款承诺书范文
2014/05/20 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
高老头读书笔记
2015/06/30 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
windows安装python超详细图文教程
2021/05/21 Python
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android