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实现批量监控网站
Sep 09 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
对python实现二维函数高次拟合的示例详解
Dec 29 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
python Django的web开发实例(入门)
Jul 31 Python
python生成requirements.txt的两种方法
Sep 18 Python
python redis 批量设置过期key过程解析
Nov 26 Python
python return逻辑判断表达式实现解析
Dec 02 Python
python 生成任意形状的凸包图代码
Apr 16 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
Sep 01 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与XML的PDF文档生成技术
2006/10/09 PHP
php数据库连接
2006/10/09 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
js实现简单模态框实例
2018/11/16 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python os模块学习笔记
2015/06/21 Python
python 统计代码行数简单实例
2017/05/04 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
初中政治教师教学反思
2016/02/23 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python