python与C、C++混编的四种方式(小结)
混编的含义有两种,
一种是在python里面写C
一种是C里面写python
本文主要是进行简化,方便使用。
#####################################################################################################
第一种、Python调用C动态链接库(利用ctypes)
pycall.c
/***gcc-olibpycall.so-shared-fPICpycall.c*/ #include#include intfoo(inta,intb) { printf("youinput%dand%d\n",a,b); returna+b; }
pycall.py
importctypes ll=ctypes.cdll.LoadLibrary lib=ll("./libpycall.so") lib.foo(1,3) print'***finish***'
运行方法:
gcc-olibpycall.so-shared-fPICpycall.c
pythonpycall.py
第2种、Python调用C++(类)动态链接库(利用ctypes)
pycallclass.cpp
#includeusingnamespacestd; classTestLib { public: voiddisplay(); voiddisplay(inta); }; voidTestLib::display(){ cout<<"Firstdisplay"< pycallclass.py
importctypes so=ctypes.cdll.LoadLibrary lib=so("./libpycallclass.so") print'display()' lib.display() print'display(100)' lib.display_int(100)运行方法:
g++-olibpycallclass.so-shared-fPICpycallclass.cpp
pythonpycallclass.py第3种、Python调用C和C++可执行程序
main.cpp
#includeusingnamespacestd; inttest() { inta=10,b=5; returna+b; } intmain() { cout<<"---begin---"< main.py
importcommands importos main="./testmain" ifos.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() printdata print'*'*10 os.system(main)运行方法(只有这种不是生成.so然后让python文件来调用):
g++-otestmainmain.cpp
pythonmain.py第4种、扩展Python(C++为Python编写扩展模块)(超级麻烦的一种)
Extest2.c
#include#include #include intfac(intn) { if(n<2)return(1); return(n)*fac(n-1); } char*reverse(char*s) { registerchart, *p=s, *q=(s+(strlen(s)-1)); while(s&&(p setup.py
#!/usr/bin/envpython fromdistutils.coreimportsetup,Extension MOD='Extest' setup(name=MOD,ext_modules=[Extension(MOD,sources=['Extest2.c'])])运行方法:
pythonsetup.pybuild
cdbuild/lib.linux-x86_64-2.7
进入python交互模式>>>
importExtest Extest.test()以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。