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笔记(叁)继续学习
Oct 24 Python
python33 urllib2使用方法细节讲解
Dec 03 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
python从sqlite读取并显示数据的方法
May 08 Python
python正则表达式re之compile函数解析
Oct 25 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
python虚拟环境迁移方法
Jan 03 Python
使用Python实现画一个中国地图
Nov 23 Python
pycharm sciview的图片另存为操作
Jun 01 Python
python 8种必备的gui库
Aug 27 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 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 短链接算法收集与分析
2011/12/30 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
原生js二级联动效果
2017/06/20 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
SQL Server面试题
2013/04/04 面试题
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
接待员岗位责任制
2014/02/10 职场文书
劳资协议书范本
2014/04/23 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
我的长征观后感
2015/06/09 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL