Python 源码剖析之基础知识

Python 源码剖析之基础知识

为了和《Python 源码剖析》一书保持一致,本系列笔记分析的源码是 cpython-2.5.6 。

Python 总体架构

Python 的总体架构可以分成三个主要的部分:

  1. 大量的核心模块、库和用户自定义模块
  • Python 作为脚本语言的核心即解释器(词法分析产生 token,语法分析建立抽象语法树,编译成字节码,虚拟机执行字节码)
  • Python 运行时环境(对象和类型体系,内存分配器,运行时状态信息)
Python 总体架构

Python 源代码组织结构

为了和参考书籍保持一致,便于学习,这里仍旧采用 cpython-2.5.6 进行研究学习。

源代码目录如下:

├── Demo
├── Doc
├── Grammar
├── Include
├── LICENSE
├── Lib
├── Mac
├── Makefile.pre.in
├── Misc
├── Modules
├── Objects
├── PC
├── PCbuild
├── PCbuild8
├── Parser
├── Python
├── README
├── RISCOS
├── Tools
├── configure
├── configure.in
├── install-sh
├── pyconfig.h.in
└── setup.py

其中:

  • Include: Python 提供的所有 C 语言头文件,当自己想用 C 或 C++ 来编写自定义模块扩展 Python 的时候,就需要用到这些头文件。可以看到里面有我们之后要研究的各种对象的声明。

➜ cpython-2.5 tree -L 1 Include
Include
├── Python-ast.h
├── Python.h
├── abstract.h
├── asdl.h
├── ast.h
├── bitset.h
├── boolobject.h
├── bufferobject.h
├── cStringIO.h
├── cellobject.h
├── ceval.h
├── classobject.h
├── cobject.h
├── code.h
├── codecs.h
├── compile.h
├── complexobject.h
├── datetime.h
├── descrobject.h
├── dictobject.h
├── enumobject.h
├── errcode.h
├── eval.h
├── fileobject.h
├── floatobject.h
├── frameobject.h
├── funcobject.h
├── genobject.h
├── graminit.h
├── grammar.h
├── import.h
├── intobject.h
├── intrcheck.h
├── iterobject.h
├── listobject.h
├── longintrepr.h
├── longobject.h
├── marshal.h
├── metagrammar.h
├── methodobject.h
├── modsupport.h
├── moduleobject.h
├── node.h
├── object.h
├── objimpl.h
......
├── pythread.h
├── rangeobject.h
├── setobject.h
├── sliceobject.h
├── stringobject.h
├── structmember.h
├── structseq.h
├── symtable.h
├── sysmodule.h
├── timefuncs.h
├── token.h
├── traceback.h
├── tupleobject.h
├── ucnhash.h
├── unicodeobject.h
└── weakrefobject.h
0 directories, 80 files

  • Lib: Python 自带的所有标准库,都是用 Python 语言编写的。可以看到有我们经常使用的类似于 base64,os 这样的 Python 标准库

➜ cpython-2.5 tree -L 1 Lib
Lib
├── BaseHTTPServer.py
├── Bastion.py
├── CGIHTTPServer.py
...

├── base64.py
...
├── hashlib.py
├── heapq.py
...
├── md5.py
...
├── optparse.py
├── os.py
├── os2emxpath.py
├── pdb.doc
├── pdb.py
├── pickle.py
├── pickletools.py
...
├── random.py
├── re.py
├── repr.py
...
├── socket.py
├── sqlite3
...
├── subprocess.py
...
├── xml
├── xmllib.py
├── xmlrpclib.py
└── zipfile.py
39 directories, 193 files

  • Modules: 该目录也是包含了 Python 自带的的模块,和 Lib 目录不同的是,Modules 下的模块都是用 C 语言编写的,是那些对速度要求非常严格的模块。比如时间相关的 datetime,timeing 等模块

➜ cpython-2.5 tree -L 1 Modules
Modules
├── Setup.config.in
├── Setup.dist
...
├── _randommodule.c
├── _sqlite
...
├── cPickle.c
├── cStringIO.c
...
├── datetimemodule.c
...
├── getpath.c
...
├── md5.c
├── md5.h
├── md5module.c
...
├── python.c
├── readline.c
├── resource.c
...
├── timemodule.c
├── timing.h
├── timingmodule.c
...
├── zipimport.c
├── zlib
└── zlibmodule.c
5 directories, 121 files

  • Parser: 该目录包含了 Python 解释器中的 Scanner 和 Parser 部分(词法分析和语法分析),还包含类似于 YACC 这样的能根据 Python 语言的语法自动生成 Python 语言的文法和词法分析器的工具。

➜ cpython-2.5 tree -L 1 Parser
Parser
├── Python.asdl
├── acceler.c
├── asdl.py
├── asdl_c.py
├── bitset.c
├── firstsets.c
├── grammar.c
├── grammar.mak
├── grammar1.c
├── intrcheck.c
├── listnode.c
├── metagrammar.c
├── myreadline.c
├── node.c
├── parser.c
├── parser.h
├── parsetok.c
├── pgen.c
├── pgenmain.c
├── printgrammar.c
├── spark.py
├── tokenizer.c
├── tokenizer.h
└── tokenizer_pgen.c
0 directories, 24 files

  • Objects: 和 Include 目录对应,这个目录包含了所有 Python 的内建对象 C 语言实现代码,还包含了 Python 在运行时需要的所有的内部使用对象的实现。

➜ cpython-2.5 tree -L 1 Objects
Objects
├── abstract.c
├── boolobject.c
├── bufferobject.c
├── cellobject.c
├── classobject.c
├── cobject.c
├── codeobject.c
├── complexobject.c
├── descrobject.c
├── dictnotes.txt
├── dictobject.c
├── enumobject.c
├── exceptions.c
├── fileobject.c
├── floatobject.c
├── frameobject.c
├── funcobject.c
├── genobject.c
├── intobject.c
├── iterobject.c
├── listobject.c
├── listsort.txt
├── longobject.c
├── methodobject.c
├── moduleobject.c
├── object.c
├── obmalloc.c
├── rangeobject.c
├── setobject.c
├── sliceobject.c
├── stringlib
├── stringobject.c
├── structseq.c
├── tupleobject.c
├── typeobject.c
├── unicodectype.c
├── unicodeobject.c
├── unicodetype_db.h
└── weakrefobject.c
1 directory, 38 files

  • Python: 该目录包含了 Python 解释器中的 Compiler 和执行引擎部分,是 Python 运行的核心所在。

➜ cpython-2.5 tree -L 1 Python
Python
├── Python-ast.c
├── asdl.c
├── ast.c
├── atof.c
├── bltinmodule.c
├── ceval.c
├── codecs.c
├── compile.c
├── dup2.c
├── dynload_aix.c
├── dynload_atheos.c
├── dynload_beos.c
├── dynload_dl.c
├── dynload_hpux.c
├── dynload_next.c
├── dynload_os2.c
├── dynload_shlib.c
├── dynload_stub.c
├── dynload_win.c
├── errors.c
├── fmod.c
├── frozen.c
├── frozenmain.c
├── future.c
├── getargs.c
├── getcompiler.c
├── getcopyright.c
├── getcwd.c
├── getmtime.c
├── getopt.c
├── getplatform.c
├── getversion.c
├── graminit.c
├── hypot.c
├── import.c
├── importdl.c
├── importdl.h
├── mactoolboxglue.c
├── marshal.c
├── memmove.c
├── modsupport.c
├── mysnprintf.c
├── mystrtoul.c
├── pyarena.c
├── pyfpe.c
├── pystate.c
├── pystrtod.c
├── pythonrun.c
├── sigcheck.c
├── strdup.c
├── strerror.c
├── strtod.c
├── structmember.c
├── symtable.c
├── sysmodule.c
├── thread.c
├── thread_atheos.h
├── thread_beos.h
├── thread_cthread.h
├── thread_foobar.h
├── thread_lwp.h
├── thread_nt.h
├── thread_os2.h
├── thread_pth.h
├── thread_pthread.h
├── thread_sgi.h
├── thread_solaris.h
├── thread_wince.h
└── traceback.c
0 directories, 69 files

修改 Python 源代码并编译安装

为了观察 Python 的执行过程,我们经常需要修改 Python 源代码,改变一些执行逻辑,添加一些日志输出,然后重新编译安装 Python 并运行观察验证结果。编译安装可以按照以下步骤:

./configure --prefix=$(pwd)
make && make install

注意,我在 Mac OS X Yosemite 10.10.3 上编译失败了,日志显示:

➜  cpython-2.5 make
gcc -c -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes  -I. -IInclude -I./Include   -DPy_BUILD_CORE -o Modules/python.o ./Modules/python.c
clang: error: unknown argument: '-mno-fused-madd'
make: *** [Modules/python.o] Error 1

gcc 识别不了相应的一个 编译参数,搜索了一下,原因应该是 XCode 的版本和当时的 2.5.6 不兼容,所以果断选择了在 Ubuntu 14.04 上编译安装 Python,很快就通过了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容