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 21 Python
windows上安装Anaconda和python的教程详解
Mar 28 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Django中使用MySQL5.5的教程
Dec 18 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
python关于集合的知识案例详解
May 30 Python
Python借助with语句实现代码段只执行有限次
Mar 23 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与paypal整合方法
2010/11/28 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
innerText 使用示例
2014/01/23 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Python中psutil的介绍与用法
2019/05/02 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
PyQt5组件读取参数的实例
2019/06/25 Python
python的debug实用工具 pdb详解
2019/07/12 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
《动手做做看》教学反思
2014/04/09 职场文书
煤矿安全生产标语
2014/06/06 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
k-means & DBSCAN 总结
2021/04/27 Python
Golang并发工具Singleflight
2022/05/06 Golang