Python 源码剖析之基础知识

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

Python 总体架构

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

大量的核心模块、库和用户自定义模块

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,很快就通过了。

python源码剖析新版_Python 源码剖析之基础知识相关推荐

  1. python实训目的意义_Python实训第二天--基础知识2

    '''''' ''' 列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' # 定义一个学生列表,可存放多个学生 # list([ ...

  2. python 源码编译教程_python源码编译

    尝试通过源码自己编译 Python,使用的系统是 Ubuntu14.04 LTS. 首先去官网下载源码,地址:源码下载.下载完成之后,解压源码: 1tar -zxvf Python-2.7.12.tg ...

  3. mysql 网络io_分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识

    作者:路路 热爱技术.乐于分享的技术人,目前主要从事数据库相关技术的研究. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 前言 对于计算机学科来说 ...

  4. python编程的基本方法有哪些_Python编程中常用的基础知识有哪些?

    今天小编要跟大家分享的文章是关于Python编程中常用的基础知识有哪些?正在从事Python相关工作的小伙伴们,来和小编一起看一看本篇文章,希望本篇文章能够对大家有所帮助. 1.正则表达式替换 目标: ...

  5. [Python学习] 专题二.条件语句和循环语句的基础知识

            前面讲述了"专题一.函数的基础知识",而这篇文章讲述的Python的条件语句和循环语句的基础知识.主要内容包括:         1.条件语句:包括单分支.双分支和 ...

  6. python定义类的程序_python扫码签到程序python中如何定义类

    什么是类? 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下: < ...

  7. python快乐编程百度云_Python趣码快乐编程

    Python的安装/2 n 下载安装相应版本的Python安装包/2 n 验证Python是否安装成功/4 n 编辑器PyCharm的安装和使用/5 n PyCharm的下载与安装/5 n PyCha ...

  8. python 字节码指令含义_python 字节码指令列表

    /*********************************************************** KVS:文件:opcode.h swith字节码指令的文件:ceval.c * ...

  9. python中的ascii码是啥_python ascii码到u

    如果您不了解底层机制,很难解释UnicodeErrors.你真的应该读其中的一个或两个 简而言之,Unicode码位是一个抽象的"东西",表示一个字符1.程序员喜欢使用它们,因为我 ...

  10. python进程池如何复用_python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

最新文章

  1. js怎么获取一个元素与屏幕右边的距离_js获取元素到屏幕左上角的距离
  2. 使用ifstream从文件中读取内容
  3. java 读utf-8 xml_〖JAVA经验〗JDom输出UTF-8的XML完美解决方法
  4. AntD 官网样例 InputRef报错原因
  5. Android睡眠唤醒机制--Kernel态
  6. Python Base64
  7. 南阳理工acm括号配对问题
  8. 国产数据库激荡 40 年
  9. 密西根州立大学计算机排名,密歇根州立大学MSU(Michigan State University)计算机科学Computer Science专业排名第91位(2021年THE世界大学商科排名)...
  10. f5 gtm 工作原理_F5 LTM工作原理.ppt
  11. 物联网-移远M26模块初识及资料分享
  12. 优联键盘linux驱动,一个坚决不用樱桃轴的优联84客制化键盘
  13. 偶然看到,也许有用!
  14. Maven之Nexus局域网私服的搭建以及上传下载的测试
  15. c语言单片机温度调节系统设计,基于单片机的温度控制系统的设计
  16. python describe 分位数设置_Python Pandas – 如何通过describe函数计算25百分位数
  17. C++设计模式----装饰器模式
  18. “带薪摸鱼”偷刷阿里老哥的面经宝典,三次挑战字节,终斩offer,修成正果!
  19. 阿菜的Vue学习之旅(一)
  20. AjaxPro 在asp.net中提示 ‘XXX’ 未定义 的问题

热门文章

  1. .net反编译工具Reflector下载
  2. 计算机常见错误代码,电脑常见错误蓝屏代码汇总及解决方法
  3. 计算机组成原理知识体系
  4. Unity3D脚本编程读书笔记——第1章 Hello Unity 3D(认识Unity3D游戏引擎)
  5. c语言蛮力法实现背包问题
  6. coreseek java_使用python测试sphinx(coreseek)做全文索引
  7. 万年历java循环,万年历代码 java万年历源代码是多少?
  8. 抖音计算机音乐的id,抖音卡点音乐叫什么名字 抖音卡点bgm介绍
  9. editplus使用
  10. 华硕飞行堡垒触摸板快捷键失效