python运行时先将.py编译为.pyc字节码再由pvm执行;首次import、源文件更新时自动生成,存于__pycache__目录,支持手动编译,但不跨版本兼容。

Python 运行时并不会直接执行 .py 源文件,而是先将其编译为字节码(bytecode),保存为 .pyc 文件,再由 Python 虚拟机(PVM)解释执行。这个过程通常是自动完成的,但也可以手动触发。
什么时候生成 .pyc 文件
Python 在以下情况下会生成或更新 .pyc 文件:
- 首次导入(import)一个模块时(如 import math_utils)
- 源文件(.py)比已有的 .pyc 文件更新(通过文件修改时间判断)
- Python 启动时使用 -B 参数会跳过写入 .pyc;用 -O 或 -OO 会生成优化版(如 __pycache__/module.cpython-312.pyc 或 module.cpython-312.opt-1.pyc)
.pyc 文件存放位置
从 Python 3.2 开始,默认不再把 .pyc 放在源码同目录,而是统一存放在 __pycache__ 子目录中,文件名包含 Python 版本和编译标记,例如:
__pycache__/main.cpython-312.pyc
本文档主要讲述的是Android中JNI编程的那些事儿;JNI译为Java本地接口。它允许Java代码和其他语言编写的代码进行交互。在android中提供JNI的方式,让Java程序可以调用C语言程序。android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Python免费学习笔记(深入)”;
这种设计避免了多版本 Python 共存时的冲突。可通过设置环境变量 PYTHONPYCACHEPREFIX 将所有缓存集中到指定路径(如构建隔离环境时有用)。
手动编译 .py 到 .pyc
有三种常用方式:
-
使用 compileall 模块:批量编译整个目录
python -m compileall myproject/ -
使用 py_compile 模块:编译单个文件
python -m py_compile script.py -
编程调用:
import py_compile
py_compile.compile('script.py', 'script.pyc')
注意点与常见问题
.pyc 文件不是跨平台、跨版本兼容的:
- 不同 Python 主版本(如 3.9 和 3.12)生成的字节码不通用
- 同一主版本下,不同次版本通常兼容,但不保证(尤其涉及新语法或内部结构变更时)
- 删除 .pyc 或 __pycache__ 不影响运行,下次 import 会自动重建
- 若模块以 zipimport 或冻结(frozen)形式分发,可能不生成 .pyc









