请向我解释Python解释器是如何执行用C/C++编写的模块的



我正在努力了解它是如何工作的。我知道Python解释器将Python源代码转换为虚拟机的字节码表示(Python解释器是虚拟机(并执行这些指令。C/C++代码到底从哪里来?这个虚拟机(Python解释器(也可以编译和执行C/C++代码吗?

我甚至不知道在这里问什么是正确的问题,只是想好好解释一下如何问。

我的背景:我用Python编程了很长一段时间(主要是分析/ML(,我对计算机系统、C编译过程、内存和处理器有一些基本的了解。但我甚至还没有接近成为这方面的专家

我只是想更好地理解,而不是太多关于如何在C.中创建Python模块的实用技巧

谢谢你,我真的很感谢你的帮助!

这一切都是关于一个可预测的入口点。CPython引用解释器(以及像PyPy这样支持此类C扩展的其他解释器(,被告知要查找给定名称的模块,并在其中一个sys.path目录中找到与扩展模块命名约定匹配的文件(例如,对于为x86-64 Linux上的CPython 3.10构建的spam模块,它将查找spam.cpython-310-x86_64-linux-gnu.so(:

  1. 使用操作系统标准方法加载动态库(也称为共享对象(,例如Windows上的LoadLibrary,POSIX系统上的dlopen
  2. 加载其中与指定命名约定匹配的入口点(在Windows上使用GetProcAddress,在POSIX上使用dlsym(,例如,对于名为spam的模块,它按照C名称篡改规则查找名为PyInit_spam的函数
  3. 调用该函数,然后完全负责所有其他设置(调用PyModule_Create,对所述模块对象执行任何修改并返回(。它调用的各种API发布信息供用户使用

CPython;标准";Python解释器是用C编写的。它在C中提供了一个扩展API,因此用C或C++编写的扩展可以注册它们自己,以便像普通的Python模块一样被调用。Python解释器无法编译C或C++;编译模块是扩展编写器的责任。但是Python可以通过API的帮助运行任意的C和C++代码。

最新更新