Python玩耍PythonPython 运维

Python 源码剖析之基础知识

2016-07-25  本文已影响175人  heamon7

Python 源码剖析之基础知识

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

Python 总体架构

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

  1. 大量的核心模块、库和用户自定义模块
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

其中:

➜ 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

➜ 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

➜ 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

➜ 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

➜ 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

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

上一篇下一篇

猜你喜欢

热点阅读