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 相关文章推荐
win7 下搭建sublime的python开发环境的配置方法
Jun 18 Python
python3 shelve模块的详解
Jul 08 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Django 删除upload_to文件的步骤
Mar 30 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
基于pycharm实现批量修改变量名
Jun 02 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
python 实现一个简单的线性回归案例
Dec 17 Python
python实现双人五子棋(终端版)
Dec 30 Python
python实现经典排序算法的示例代码
Feb 07 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 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后台如何避免用户直接进入方法实例
2013/10/15 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
php绘制一个矩形的方法
2015/01/24 PHP
php封装的smarty类完整实例
2016/10/19 PHP
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python使用matplotlib画饼状图
2018/09/25 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
基于python3的socket聊天编程
2020/02/17 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
学校运动会报道稿
2014/09/23 职场文书
入党函调证明材料
2014/12/24 职场文书