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根据经纬度计算距离示例
Feb 16 Python
Python Socket编程入门教程
Jul 11 Python
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
Python版名片管理系统
Nov 30 Python
Python中捕获键盘的方式详解
Mar 28 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
python内存管理机制原理详解
Aug 12 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 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中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
解决layer.prompt无效的问题
2019/09/24 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
Python导入oracle数据的方法
2015/07/10 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python中的随机函数小结
2018/01/27 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python3获取url文件大小示例代码
2019/09/18 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
公立医院改革实施方案
2014/03/14 职场文书
村党建工作汇报材料
2014/11/02 职场文书
离婚协议书格式范本
2016/03/18 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript