写代码的时候遇到一个问题,排查出现的原因后便想调试下Python解释器来跟踪是怎么实现的,众所周知,Python官方版本的解释器是C语言的实现的CPython,那先从编译CPython解析器开始吧。
环境准备
1、CPython的源码直接从官网或者通过git从Github上获取,这里我使用的是Python 3.7.7
版本
2、按照官方文档,Python 3.6
版本以上需要安装Visual Studio 2017
,相关的开发组件我此前已经安装过,这里列出组件吧:
目录结构
1、先看一下源码的顶级目录结构和各个目录的作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Length Name ------ ---- Doc # 官方文档 Grammar # Python的EBNF语法定义文件 Include # 头文件 Lib # 用纯Python实现的一部分标准库 m4 Mac # Mac专用代码 Misc # 此目录包含其他地方无法容纳的文件,有些文件仅具有历史意义 Modules # 用C实现的一部分标准库 Objects # 内置数据类型实现 Parser # 与解析器相关的代码 PC # Windows专用代码 PCbuild # MSVC版本的构建文件 Programs # C可执行文件的源代码,包含main函数入口 Python # 构成核心CPython运行时的代码 Tools # 用于维护Python的各种工具
|
关于EBNF可查看:
https://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F
2、下载源代码依赖:
以管理员身份运行PowerShell进入PCbuild
目录(不以管理员身份运行可能在Fetch OpenSSL时遇到无权限的问题)
1 2 3 4 5 6 7 8 9 10 11
| > .\get_externals.bat Using py -3.7 (found 3.7 with py.exe) Fetching external libraries... Fetching bzip2-1.0.6... Fetching sqlite-3.31.1.0... Fetching xz-5.2.2... Fetching zlib-1.2.11... Fetching external binaries... Fetching openssl-bin-1.1.1d... Fetching tcltk-8.6.9.0... Finished.
|
完成后会在解释器目录中生成externals
文件夹,下载的依赖均在此文件夹中。
进行编译
1、完成上述几步后,进入PCbuild
目录双击pcbuild.sln
,等待解决方案加载完成:
2、在工具栏上调整DEBUG -> X64
3、解决方案->右键->属性->配置,可以看到解决方案中列出的项目,这里可以选择自己关心的项目再生成解决方案
4、启动本地Windows调试器
5、完成后会弹出解释器控制台,生成的目录为PCbuild/amd64
,其中包含解释器python_d.exe和内核python37_d.dll
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/6/21 15:02 7823360 python37_d.dll -a---- 2020/6/21 15:02 213901 python37_d.exp -a---- 2020/6/21 15:02 7654288 python37_d.ilk -a---- 2020/6/21 15:02 348088 python37_d.lib -a---- 2020/6/21 15:02 7802880 python37_d.pdb -a---- 2020/6/21 15:02 135680 python_d.exe -a---- 2020/6/21 15:02 268072 python_d.ilk -a---- 2020/6/21 15:02 380928 python_d.pdb -a---- 2019/9/7 0:43 85784 vcruntime140.dll -a---- 2020/6/21 15:02 983 _ctypes_d.exp -a---- 2020/6/21 15:02 942508 _ctypes_d.ilk -a---- 2020/6/21 15:02 1756 _ctypes_d.lib -a---- 2020/6/21 15:02 757760 _ctypes_d.pdb -a---- 2020/6/21 15:02 266240 _ctypes_d.pyd
|
弹出的解释器控制台如图:
接下来就可以通过调试源码来查看我关心的问题如何实现的了🤓
参考
1、https://zh.wikipedia.org/wiki/CPython
2、https://devguide.python.org/setup/#windows
3、https://cpython-core-tutorial.readthedocs.io/en/latest/build_cpython_windows.html
4、https://devguide.python.org/setup/#directory-structure
5、https://devguide.python.org/exploring/#cpython-source-code-layout