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嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
Python函数中不定长参数的写法
Feb 13 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
python字符串查找函数的用法详解
Jul 08 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
Python实现归一化算法详情
Mar 18 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 preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
js常用函数 不错
2006/09/08 Javascript
Mootools 1.2教程 事件处理
2009/09/15 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
js分页代码分享
2014/04/28 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
Python最小二乘法矩阵
2019/01/02 Python
python try 异常处理(史上最全)
2019/03/07 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
扬州个园导游词
2015/02/06 职场文书
投标售后服务承诺书
2015/04/29 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
Minikube搭建Kubernetes集群
2022/03/31 Servers