最近在探索 Python 的源码,但是,发现瞎看也没啥意思,所以就想折腾折腾。折腾的方式有很多,例如可以修改源码,然后重新编译,但是这样玩对于探索来说周期似乎有点长,而且效果不明显;而我选择的是直接编写 C++ 代码,然后调用 Python 的 API,通过查看 Python API 来查看内部的结构/方法和数据状态,从而来发掘 Python 的一些实现原理。

使用 Python API 虽然比较方便,但是还是有一些准备工作需要做的,这里先介绍一下我的软件环境:

编译 Python 开发环境

其实很多同学都会选择走一条捷径,那就是使用包管理工具安装,类似于:

apt install python-dev

这是一种方法,但是,使用这种方法不好控制 Python 的版本,同时,我们如果要想修改一些代码也不好改啊,所以还是从源码来安装会稳健一些,可以保证我们用的就是我们看到的!

  1. 下载 Python3.6.2 源代码

    这个可以直接从 Python 的官方网站下载下来,或者你直接用我这个下载:Python3.6.2 源代码

  2. 编译源代码

    编译我们可以以简单的三部曲走,如果怕覆盖以前的旧版本之内的,可以指定安装目录,我这里为了方便,直接编译了,不加附加参数:

     $ tar zxf Python-3.6.2.tgz
     $ cd Python-3.6.2
     $ ./configure --with-shared
     $ make && make install

    然后就等待编译安装完成咯。

  3. 测试编译代码

    编译安装完成之后,我们得验证一下,是不是一切正常,所以写段代码试试:

    这段代码可以在我的 Github 代码库中找到:PythonAPI测试代码

    然后编译看看,注意,编译的时候我们需要指定 Python 的头文件和链接文件位置:

     $ g++ -ggdb main.cpp -O1 $(python3-config --includes) $(python3-config --libs)
     $ ./a.out
     size of PyTupleObject: 16
     3
     (1, 2, 'three')

    如果看到和我一致的输出,那么说明你的 Python API 测试环境是 OK 的,后面我将用这个环境验证和探索一些有趣的事情,可以期待一下。

Reference

  1. Calling python from a c++ program for distribution
  2. Python/C API Reference Manual