副问题[/!--empirenews.page--]
1. 进程概述
Python先把代码(.py文件)编译成字节码,交给字节码假造机,然后假造机一条一条执行字节码指令,从而完成措施的执行。
2. 字节码
字节码在Python假造机措施里对应的是PyCodeObject工具。 .pyc文件是字节码在磁盘上的示意情势。
3. pyc文件
PyCodeObject工具的建设机缘是模块加载的时辰,即import。 Python test.py会对test.py举办编译成字节码并表明执行,可是不会天生test.pyc。 假如test.py加载了其他模块,如import util,Python会对util.py举办编译成字节码,天生util.pyc,然后对字节码表明执行。 假如想天生test.pyc,我们可以行使Python内置模块py_compile来编译。 加载模块时,假犹如时存在.py和.pyc,Python会实行行使.pyc,假如.pyc的编译时刻早于.py的修改时刻,则从头编译.py并更新.pyc。
4. PyCodeObject
Python代码的编译功效就是PyCodeObject工具。
- typedef struct {
- PyObject_HEAD
- int co_argcount; /* 位置参数个数 */
- int co_nlocals; /* 局部变量个数 */
- int co_stacksize; /* 栈巨细 */
- int co_flags;
- PyObject *co_code; /* 字节码指令序列 */
- PyObject *co_consts; /* 全部常量荟萃 */
- PyObject *co_names; /* 全部标记名称荟萃 */
- PyObject *co_varnames; /* 局部变量名称荟萃 */
- PyObject *co_freevars; /* 闭包用的的变量名荟萃 */
- PyObject *co_cellvars; /* 内部嵌套函数引用的变量名荟萃 */
- /* The rest doesn’t count for hash/cmp */
- PyObject *co_filename; /* 代码地址文件名 */
- PyObject *co_name; /* 模块名|函数名|类名 */
- int co_firstlineno; /* 代码块在文件中的起始行号 */
- PyObject *co_lnotab; /* 字节码指令和行号的对应相关 */
- void *co_zombieframe; /* for optimization only (see frameobject.c) */
- } PyCodeObject;
5. pyc文件名目
加载模块时,模块对应的PyCodeObject工具被写入.pyc文件,名目如下:
6. 说明字节码
6.1 理会PyCodeObject
Python提供了内置函数compile可以编译Python代码和查察PyCodeObject工具,如下:
Python代码[test.py]
- s = ”hello”
-
- def func():
- print s
-
- func()
在Python交互式shell里编译代码获得PyCodeObject工具:
dir(co)已经列出co的各个域,想查察某个域直接在终端输出即可:
test.py的PyCodeObject
- co.co_argcount 0
- co.co_nlocals 0
- co.co_names (‘s’, ’func’)
- co.co_varnames (‘s’, ’func’)
- co.co_consts (‘hello’, <code object func at 0x2aaeeec57110, file ”test.py”, line 3>, None)
- co.co_code ’dx00x00Zx00x00dx01x00x84x00x00Zx01x00ex01x00x83x00x00x01dx02x00S’
Python表明器会为函数也天生的字节码PyCodeObject工具,见上面的co_consts[1]
func的PyCodeObject
- func.co_argcount 0
- func.co_nlocals 0
- func.co_names (‘s’,)
- func.co_varnames ()
- func.co_consts (None,)
- func.co_code ‘tx00x00GHdx00x00S’
co_code是指令序列,是一串二进制流,它的名目息争析要领见6.2。
6.2 理会指令序列
指令序列co_code的名目
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|