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实现socket端口重定向示例
Feb 10 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
python使用sorted函数对列表进行排序的方法
Apr 04 Python
Python中的rjust()方法使用详解
May 19 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 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输出1000以内质数(素数)示例
2014/02/16 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
js实现简单的倒计时
2021/01/28 Javascript
python抓取百度首页的方法
2015/05/19 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
python 同时读取多个文件的例子
2019/07/16 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
高三英语教学反思
2014/01/13 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
办公室岗位职责
2014/02/12 职场文书
公证委托书
2014/08/01 职场文书
政府四风问题整改措施
2014/10/04 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
歌咏比赛主持词
2015/06/29 职场文书