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 break语句详解
Mar 11 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
Python基于twisted实现简单的web服务器
Sep 29 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python单元测试unittest的具体使用示例
Dec 17 Python
python学习开发mock接口
Apr 28 Python
Python各种扩展名区别点整理
Feb 27 Python
基于python生成英文版词云图代码实例
May 16 Python
Python数据模型与Python对象模型的相关总结
Jan 26 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 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和ACCESS写聊天室(九)
2006/10/09 PHP
php str_pad 函数用法简介
2009/07/11 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
php在线代理转向代码
2012/05/05 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
Javascript Global对象
2009/08/13 Javascript
jQuery入门知识简介
2010/03/04 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
Vue点击切换颜色的方法
2018/09/13 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
Python中几个比较常见的名词解释
2015/07/04 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
python装饰器原理与用法深入详解
2019/12/19 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
党支部书记先进事迹
2014/01/17 职场文书
安全生产责任书
2014/03/12 职场文书
中职招生先进个人材料
2014/08/31 职场文书
国家助学金感谢信
2015/01/21 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python