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 translator使用实例
Sep 06 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Python制作Windows系统服务
Mar 25 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
使用python存储网页上的图片实例
May 22 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python龙贝格法求积分实例
Feb 29 Python
Python hashlib模块的使用示例
Oct 09 Python
Python ellipsis 的用法详解
Nov 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
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
Django的session中对于用户验证的支持
2015/07/23 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
Python中print和return的作用及区别解析
2019/05/05 Python
Python pandas库中的isnull()详解
2019/12/26 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
Python截图并保存的具体实例
2021/01/14 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
酒店值班经理的工作职责范本
2014/02/18 职场文书
精彩广告词大全
2014/03/19 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
教师学习心得体会范文
2016/01/21 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS
详解Laravel服务容器的优势
2021/05/29 PHP