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中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
Python时间戳使用和相互转换详解
Dec 11 Python
Python实现求数列和的方法示例
Jan 12 Python
3分钟学会一个Python小技巧
Nov 23 Python
Python字典的核心底层原理讲解
Jan 24 Python
Python multiprocessing多进程原理与应用示例
Feb 28 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
python图像和办公文档处理总结
May 28 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 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
ThinkPHP模板中数组循环实例
2014/10/30 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
python连接字符串的方法小结
2015/07/13 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
Pycharm修改python路径过程图解
2020/05/22 Python
通过cmd进入python的步骤
2020/06/16 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
房屋公证委托书
2014/04/03 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
会议通知
2015/04/15 职场文书
Python天气语音播报小助手
2021/09/25 Python