python与C、C++混编的四种方式
混编的含义有两种,
一种是在python里面写C
一种是C里面写python
本文针对第一种,参考链接来自:
https://www.cnblogs.com/apexchu/p/5015961.html
本文主要是进行简化,方便使用。
#####################################################################################################
第一种、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与C、C++混编的四种方式相关推荐
- python与c混合编程 版本_python与C、C++混编的四种方式(小结)
混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...
- python和c混编_python与C、C++混编的四种方式(小结)
混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...
- python c++情侣网名含义_python与C、C++混编的四种方式(小结)
混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...
- python和c语言混合编程-python和C语言混编的几种方式
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7594551.html 作者:窗户 Q ...
- python异常处理的方法_python异常处理的四种方式,不只是try
对于python程序中,进行异常捕获,一般我们都用try except,但是还有其他方式经常使用. 以后再进行异常处理时,知道有四种方式,可以考虑更合适的方式 下面介绍一下四种方式 1.内部抛出异常( ...
- python与c语言混合编程_python和C语言混编的几种方式
Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...
- PHP/HTML混写的四种方式
PHP作为一款后端语言,为了输出给浏览器让浏览器呈现出来,无可避免的要输出HTML代码,下文介绍下我用过的三种PHP/HTML混编方法 1.单/双引号包围法 这是最初级的方法了,用法就像下面这样 &l ...
- Python、C/C++混编实现最短路径可视化—Dijkstra算法
摘 要 本文讲述的是主要是运用C/C++语言Dijkstra算法来完成交通图的存储.图中任一顶点到其余任意一顶点间的最短路径问题,并利用Python中的复杂网络分析库Networkx来绘制有向图以 ...
- python定时任务_Python3实现定时任务的四种方式
最近做一个小程序开发任务,主要负责后台部分开发:根据项目需求,需要实现三个定时任务: 1>定时更新微信token,需要2小时更新一次: 2>商品定时上线: 3>定时检测后台服务是否存 ...
最新文章
- 开源oa_开源OA:可以轻松支持云文档管理
- 远程桌面的分辨率最大不会超过本机真实物理机的分辨率
- day22-Model数据验证以及钩子
- C++ Data语意学
- 一张图看懂单机/集群/热备/磁盘阵列(RAID)
- java获取上周任意一天的日期
- 《libGDX移动游戏开发从入门到精通》一1.5 其他的一些准备工作
- 关于最新版的JCreator只能编译不能运行的问题
- c语言数学函数库根号程序,用C 编写程序时根号肿么输入
- PLC控制一阶惯性纯滞后系统的大林(Dahlin)算法详解(SCL代码)
- php 显示探针_X 探针(刘海探针)-免费开源 PHP 探针
- 九宫格日记-2011年11月13日
- Windows操作系统----安全机制----Token
- 携程的供应链和流量逻辑|一点财经
- (基础篇1-15)项目架构简介及环境搭建
- JAVA校招基础面试题
- FeedBurner: 使用RSS路由器的风险
- Android studio app启动时默认启动页面为自定义界面
- Buuctf—极客大挑战练习
- DPLL 算法(求解k-SAT问题)详解(C++实现)
热门文章
- 修改NLS_DATE_FORMAT的四种方式
- 《Getting Real》读书笔记
- ASP.NET MVC 3: Razor视图引擎中 @: 和text 语法【转载】
- 论文总结:Fast and Light Bandwidth Testing for Internet Users(21‘ NSDI)
- 前端模块规范AMD/UMD/CommonJs
- mysql存储过程into_MySQL存储过程中使用SELECT …INTO语句为变量赋值
- 台式电脑如何截屏_如何选购台式电脑显卡?小白装机通俗易懂的独立显卡知识指南...
- bat文件先杀掉端口号,然后启动jar包
- JavaScript面向对象——封装及相关原理解析
- CSS3之计算长度值------calc()