最近在探索 Python 的源码,但是,发现瞎看也没啥意思,所以就想折腾折腾。折腾的方式有很多,例如可以修改源码,然后重新编译,但是这样玩对于探索来说周期似乎有点长,而且效果不明显;而我选择的是直接编写 C++ 代码,然后调用 Python 的 API,通过查看 Python API 来查看内部的结构/方法和数据状态,从而来发掘 Python 的一些实现原理。
使用 Python API 虽然比较方便,但是还是有一些准备工作需要做的,这里先介绍一下我的软件环境:
- OS
- Description: Ubuntu 16.04.2 LTS
- Codename: xenial
- Python
- Version:3.6.2
- Compiler
- g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
- GNU Make 4.1 Built for x86_64-pc-linux-gnu
编译 Python 开发环境
其实很多同学都会选择走一条捷径,那就是使用包管理工具安装,类似于:
apt install python-dev
这是一种方法,但是,使用这种方法不好控制 Python 的版本,同时,我们如果要想修改一些代码也不好改啊,所以还是从源码来安装会稳健一些,可以保证我们用的就是我们看到的!
下载 Python3.6.2 源代码
这个可以直接从 Python 的官方网站下载下来,或者你直接用我这个下载:Python3.6.2 源代码
编译源代码
编译我们可以以简单的三部曲走,如果怕覆盖以前的旧版本之内的,可以指定安装目录,我这里为了方便,直接编译了,不加附加参数:
$ tar zxf Python-3.6.2.tgz $ cd Python-3.6.2 $ ./configure --with-shared $ make && make install
然后就等待编译安装完成咯。
测试编译代码
编译安装完成之后,我们得验证一下,是不是一切正常,所以写段代码试试:
这段代码可以在我的 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 的,后面我将用这个环境验证和探索一些有趣的事情,可以期待一下。