挺简单的,Python的官方文档中有专门一个叫Python/C API的文档,是Python暴露给用户来编写模块的api,是用纯c语言的,直接编译生成dll或so动态链接库,改扩展名为pyd就可以放到python目录下的DLL文件夹里,在Python里直接import就行。
用这种方式你就基本能彻底理解Python中一切皆对象的概念,所有的所有都是一个叫PyObject的东西,就连代码块都是一个叫PyCode的东西。也会让你逐渐注意到Python的垃圾回收机制里引用计数的东西,每次处理PyObject都需要考虑引用计数要不要加1,什么时候加1,这些都是手动的。
看了其他回答,有用cpython来调c++动态链接库的,傻子才会这么干,low的一批。有用boost Python的,那玩意最近貌似不支持跨python版本了,其实boost Python就是对Python/C api进行的封装。
之前发现Python的pymysql模块是用Python写的,担心其性能,速度有问题,打算用c++写,就用了boost python库,结合MySQL的c++ api,成功写成了模块。后来测试时发现,boost Python在编译的时候用的是我电脑中的python 3.7的环境,编译时链接的是python37.lib,而不是python.lib,导致其他版本的python不能使用boost python编写的python模块。查资料发现编译boost可以通过配置来指定为全版本的python,但发现没有用,文章太老,已经不适合现在的boost。可能是我太菜了,还是编译不出来全python版本的boost python。就放弃了,以后一直都用原生的c语言api。
最近发现opencv里写python模块的部分用的就是python原生api,好亲切。