执行脚本本身
直接运行的脚本本身不会生成 .pyc 文件,每次运行都重新编译源代码,编译生成的字节码仅存在于内存中,程序结束后字节码即被丢弃。

PS:橙色路径显示字节码内存由操作系统统一回收,而非Python主动清理
导入模块:首次导入
当文件作为模块被导入时,首次导入模块对象,会先创建一个空模块对象加入sys.modules缓存,并执行模块加载
- 语法校验通过导入成功后编译为字节码(
.pyc文件),保存到__pycache__目录,后续再导入直接从此表读取(无需重新编译或执行,加快运行速度)。 - 若导入失败,所有中间状态被回滚,从
sys.modules中删除缓存,不生成.pyc文件 - 当
.py源文件被修改(根据时间戳判断)且该文件缓存过,源文件会重新编译并更新.pyc文件
导入模块:重复导入
重复导入时,直接从 sys.modules 读取模块对象,不执行模块内的代码。(比如:导入的模块顶层代码中包含print语句时,只有首次导入或者源文件更新时才会被执行,后续不会执行)

缓存文件生命周期
曾经导入成功的模块后续导入失败时,.pyc 文件不会被自动删除。

特殊运行方式:交互式环境
脚本运行是整个文件作为编译单元,交互式环境是单行作为编译单元,也就是解析一行代码为字节码后直接解释运行,再解析下一行代码。即:运行N行 = 每一行(解析+解释+运行) * N次
