c++中调用python,python函数互相调用

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: