大蟒蛇python教程共享python 与c++相互调用实现

一、c++调用python

将python安装目录下的includelibs文件夹引入到项目中,将libs目录下的python37.lib复制一份为python37_d.lib

1.python脚本

2.c++调用python脚本

二、接口方法

python3.6提供给c/c++接口函数,基本都是定义pylifecycle.hpythonrun.hceval.h中。

  • py_initialize() 和 py_finalize():必须先调用py_initialize()进行初始化,这个api用来分配python解释器使用的全局资源,应用程序结束时需要调用py_finalize()来关闭python的使用环境。
  • py_isinitialized():用来判断python解释器是否初始化成功,true为成功,false为失败。
  • pyerr_print() & pyerr_clear():执行python出错时,pyerr_print()可将错误信息显示出来,pyerr_clear()将错误信息在python解释器的缓存清除。
  • pyrun_simplestring():这个函数能够用来执行简单的python语句。
  • pyeval_initthreads():如果使用多线程调用python脚本,就需要在初始化python解释器时调用pyeval_initthreads()来启用线程支持(导致python内部启用线程锁),最好在主线程启动时就调用。该api同时也锁定全局解释锁,所以,还需要在初始化完成后需要自行释放锁。
  • 如果不需要使用多线程,不建议启用该选项,互斥锁也会不可避免的增加系统开销。

1.规范化语法

三、pthon调用c++

python调用c++一种是基于extern 的方式,另一种是swig

1.基于extern

初级版:

首先先看一下python调用c

c代码:

python代码:

编译:

gcc -g -o libpycall_c.so -shared -fpic pycall_c.c

然后基于c++改造上述代码(使用g++编译生成c动态库的代码中的函数或者方法,需要使用extern “c”来进行编译)

c++代码:

python代码:

编译:

g++ -g -o libpycall.so -shared -fpic pycall.cpp

升级版:

c++定义一个类,通过python调用c++类的方法

python 代码:

编译:

g++ -g -o libpycall.so -shared -fpic -std=c++11 pycall.cpp

2.基于swig

swig是一种软件开发工具,能让一些脚本语言调用c/c++语言的接口。它实现的方法是,通过编译程序将c/c++的声明文件(.i文件)编译成c/c++的包装器源代码(.c或.cxx)。通过直接调用这样的包装器接口,脚本语言可以间接调用c/c++语言的程序接口。

参考地址:https://github.com/swig/swig

首先安装,源码或者pip

案例:

有这样一段c的代码,文件名为example.c

你想在你的脚本语言的代码里面调用fact函数。你可以通过一段非常简单的swig脚本,文件名为example.i:(这里的格式非常重要,即使第一行的注释也不能省略)

这段.i文件分成3个部分:

  • 第一部分是%module example%module是swig脚本的一个命令,它表示生成的包装器将在一个模块内的名称。
  • 第二部分是%{… %},这一部分的内容会原封不动的插入到xxxx_wrap.cxxxx_wrap.cxx文件中。
  • 第三部分就是剩下的部分了。这部分就是c语言或者c++语言的接口声明了。和c/c++的语法是一样的。

接下来以linux操作系统下,为python语言生成接口为例:

执行上述语句会生成两个文件example.pyexample_wrap.cexample.py就是python语言可以调用的example模块,而example_wrap.c则封装了example.c的封装器。

然后执行第二步:

执行该步会生成两个o文件,example.oexample_wrap.o

最后执行:

这一步会将上面两个o文件封装成一个新的动态库,_example.so。在这之后就可以在python内直接调用example.c提供的接口了。

到此这篇关于python 与c++相互调用实现的文章就介绍到这了,更多相关python 与c++相互调用内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多python教程分享python 与c++相互调用实现,都可以关注python教程分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/pythontutorial/1061017.html

(0)
上一篇 2022年3月5日
下一篇 2022年3月5日

精彩推荐