python相关知识
1 python原理
Python先把代码编译成字节码,交给虚拟机执行。
.pyc文件是字节码在磁盘上的表现形式
字节码在虚拟机程序里面对应的对象是PyCodeObject对象(C++对象)
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;
pyc和PyCodeObject
python运行之前首先进行编译,编译的结果是在内存中的PyCodeObject对象。当程序结束运行,内存中的PyCodeObject对象被持久化到.pyc文件中。当第二次运行时,首先运行pyc文件,如果pyc文件不存在才会再进行编译,重复刚开始的情形。
简单说,.pyc文件就是PyCodeObject的持久化存储。
2 python脚本的执行过程
启动解释器:
当你在命令行中输入python xxx.py时,操作系统会启动Python解释器。
编译代码:
Python解释器首先将脚本中的源代码(文本)编译成字节码。如果Python脚本之前已经被编译过,并且源代码没有变化,解释器可能会直接加载.pyc文件中的字节码,以加快启动速度。
执行字节码:
编译得到的字节码随后被送到Python虚拟机(PVM)执行。
结束执行:
当脚本执行完毕,或者遇到系统退出命令(如sys.exit()),Python解释器会结束当前脚本的执行。在这个过程中,解释器会进行清理工作,如关闭打开的文件、清理内存等。
返回结果:
脚本执行完成后,会返回一个退出状态码给操作系统。通常情况下,如果脚本成功执行,返回的状态码为0;如果执行过程中遇到错误,返回非0状态码。
整个过程是由Python解释器自动管理的,用户只需要关注脚本的编写和执行命令即可。这种执行机制使得Python代码具有很好的跨平台性,因为同一份脚本在不同的操作系统上,只要有相应的Python解释器,就可以以相同的方式运行。
Python解释器可以以两种模式运行:
交互模式:当你在命令行中直接运行python命令时,没有指定文件,它会进入一个交互式会话。在这个模式下,你可以逐行输入Python代码,解释器会立即执行这些代码并显示结果。这种模式非常适合学习和实验。
脚本模式:如果你在python命令后面指定了一个.py文件,解释器会执行该文件中的Python代码。例如,如果你有一个名为script.py的文件,你可以通过在命令行中输入python script.py来运行它。