python源码剖析新版_Python 源码剖析之基础知识
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 源码剖析之基础知识相关推荐
- python实训目的意义_Python实训第二天--基础知识2
'''''' ''' 列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' # 定义一个学生列表,可存放多个学生 # list([ ...
- python 源码编译教程_python源码编译
尝试通过源码自己编译 Python,使用的系统是 Ubuntu14.04 LTS. 首先去官网下载源码,地址:源码下载.下载完成之后,解压源码: 1tar -zxvf Python-2.7.12.tg ...
- mysql 网络io_分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识
作者:路路 热爱技术.乐于分享的技术人,目前主要从事数据库相关技术的研究. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 前言 对于计算机学科来说 ...
- python编程的基本方法有哪些_Python编程中常用的基础知识有哪些?
今天小编要跟大家分享的文章是关于Python编程中常用的基础知识有哪些?正在从事Python相关工作的小伙伴们,来和小编一起看一看本篇文章,希望本篇文章能够对大家有所帮助. 1.正则表达式替换 目标: ...
- [Python学习] 专题二.条件语句和循环语句的基础知识
前面讲述了"专题一.函数的基础知识",而这篇文章讲述的Python的条件语句和循环语句的基础知识.主要内容包括: 1.条件语句:包括单分支.双分支和 ...
- python定义类的程序_python扫码签到程序python中如何定义类
什么是类? 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下: < ...
- python快乐编程百度云_Python趣码快乐编程
Python的安装/2 n 下载安装相应版本的Python安装包/2 n 验证Python是否安装成功/4 n 编辑器PyCharm的安装和使用/5 n PyCharm的下载与安装/5 n PyCha ...
- python 字节码指令含义_python 字节码指令列表
/*********************************************************** KVS:文件:opcode.h swith字节码指令的文件:ceval.c * ...
- python中的ascii码是啥_python ascii码到u
如果您不了解底层机制,很难解释UnicodeErrors.你真的应该读其中的一个或两个 简而言之,Unicode码位是一个抽象的"东西",表示一个字符1.程序员喜欢使用它们,因为我 ...
- python进程池如何复用_python进程池剖析(一)
python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...
最新文章
- js怎么获取一个元素与屏幕右边的距离_js获取元素到屏幕左上角的距离
- 使用ifstream从文件中读取内容
- java 读utf-8 xml_〖JAVA经验〗JDom输出UTF-8的XML完美解决方法
- AntD 官网样例 InputRef报错原因
- Android睡眠唤醒机制--Kernel态
- Python Base64
- 南阳理工acm括号配对问题
- 国产数据库激荡 40 年
- 密西根州立大学计算机排名,密歇根州立大学MSU(Michigan State University)计算机科学Computer Science专业排名第91位(2021年THE世界大学商科排名)...
- f5 gtm 工作原理_F5 LTM工作原理.ppt
- 物联网-移远M26模块初识及资料分享
- 优联键盘linux驱动,一个坚决不用樱桃轴的优联84客制化键盘
- 偶然看到,也许有用!
- Maven之Nexus局域网私服的搭建以及上传下载的测试
- c语言单片机温度调节系统设计,基于单片机的温度控制系统的设计
- python describe 分位数设置_Python Pandas – 如何通过describe函数计算25百分位数
- C++设计模式----装饰器模式
- “带薪摸鱼”偷刷阿里老哥的面经宝典,三次挑战字节,终斩offer,修成正果!
- 阿菜的Vue学习之旅(一)
- AjaxPro 在asp.net中提示 ‘XXX’ 未定义 的问题
热门文章
- .net反编译工具Reflector下载
- 计算机常见错误代码,电脑常见错误蓝屏代码汇总及解决方法
- 计算机组成原理知识体系
- Unity3D脚本编程读书笔记——第1章 Hello Unity 3D(认识Unity3D游戏引擎)
- c语言蛮力法实现背包问题
- coreseek java_使用python测试sphinx(coreseek)做全文索引
- 万年历java循环,万年历代码 java万年历源代码是多少?
- 抖音计算机音乐的id,抖音卡点音乐叫什么名字 抖音卡点bgm介绍
- editplus使用
- 华硕飞行堡垒触摸板快捷键失效