c++中调用python,python函数互相调用
Python这几年风头正劲,占据了很多领域。Web、大数据、人工智能、运维都有它的存在,连图形界面都很流畅。甚至全栈这个词刚出来的时候,好像都是用来形容的。
虽然Python的GIL问题导致多线程无法充分利用多核,但是后期的多进程可以从多进程的角度利用多核,甚至亲和可以绑定特定的CPU核,所以这个问题已经解决了。虽然基本上是全栈语言,但有时候为了效率,可能还是会考虑和C语言混合使用。
编译是计算机中不可回避的话题,涉及很多东西,技术、架构、团队情况、管理、客户等方方面面。可能对它有影响。我想我会再开一个帖子来讨论这个问题。本文只谈python和C的混合方式。大致有以下几种方式(本文背景是linux,其他平台可以类比):
共享库
用C语言编译生成共享库,然后python使用ctype库中的cdll打开共享库。
例如,C语言代码是
/*func.c*/
intfunc(inta)
{
return * a;
}python代码是
#!/usr/bin/envpython
#test_so.py
fromctypesimportcdll
进口货
p=os.getcwd() /libfunc.so
f=cdll。加载库(p)
printf.func(99)测试如下:
$ gcc-fPIC-shared func . c-olib func . so
$./test_so.py
subprocess9801号
c语言设计一个完整的可执行文件,然后python通过subprocess执行可执行文件,本质上就是fork execve。
例如,C语言代码是
/*test.c*/
# includestdio.h
intfunc(inta)
{
return * a;
}
intmain(intargc,char**argv)
{
intx
sscanf(argv[1], %d ,x);
printf(%dn ,func(x));
return0
}Python代码是
#!/usr/bin/envpython
#test_subprocess.py
进口货
import子流程
subprocess . call([OS . getcwd()/a . out , 99])的测试如下:
$gcctest.c-oa.out
$./测试_子流程. py
C语言中运行python程序9801号
c语言使用popen/system或者直接使用系统调用级fork exec运行python程序也是一种混合方法。
例如,Python代码如下:
>
#!/usr/bin/envpython
C语言代码如下:
/*test.c*/
测试如下:
$gcctest.c
python对C语言扩展的支持
很多编程语言都为C语言扩展添加了支持,这有两种原因:
(1)语言设计之初,可以充分的利用C语言已有的库来做很多扩展;
(2)C语言的运行效率高。
python也不例外,从诞生那天起,很多库都是C语言写的。python的C语言扩展中涉及到python的数据结构与C语言的对应,扩展方法其实是用C语言编写一个共享库,只是这个共享库中的接口是一个规范的,可以被python识别的。
为了说明如何扩展,我这里先假设一个在python下的函数功能,代码如下:
deffunc(*a):
如上,希望的函数功能是,参数是任意多个数字组成的列表(姑且排除其他数据结构),返回每个列表的元素之和的乘积。
姑且先把python代码写了,如下所示:
#!/usr/bin/envpython
带上之前一直测试的平方func,这个实现相对简单,希望python写出来的func可以和C语言扩展出来的结果一致。
先用C语言写上这些函数的实现,其中func3用上了一个表示任意多个任意长的数组的数据结构y_t,而x_t用来表示单个数组。
/*colin.h*/
上面定义了三个函数,func2代表平方,func3代表之前所说的功能,又因y_t这个结构可能都是动态分配出来的,所以给个归还内存的方法。
刚才说过python扩展的话,需要把这个共享库的接口“标准化”一下。于是我们就包装一下,并给个python加载的入口。
/*wrap.c*/
过程中,我猜测PyArg_VaParse应该功能更为强大,可是反复测没有成功,也没细看文档。
测试一下
$gcc-I/usr/include/python2.7/-fPIC-sharedcolin.cwrap.c-ocolin.so
可以看到,C语言写的函数和python写的函数结果一致。
众多python培训视频,尽在盛行IT软件开发工作室,欢迎在线学习!
本文转自:https://www.jianshu.com/p/9ffc1534e588
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。