Python 项目里可以用 compileall 提前扫语法错误

47 次浏览2 条回复

如果想在提交前快速确认一批 Python 文件都能被解析,可以直接用标准库的 compileall,不用先跑完整测试。

环境:Python 3.8+,在项目根目录执行:

python -m compileall -q src

没有输出通常就是通过;语法错误会打印文件和位置,并返回非零退出码。它会递归检查目录里的 .py 文件,并生成 __pycache__,不想留下缓存的话可以在临时副本或 CI 工作目录里跑。

只检查单个文件也可以:

python -m py_compile app.py

拿来做一个很轻量的提交前门槛还挺合适,运行速度也比完整测试快。

补充一点:compileall 只负责把源码解析成字节码,不能发现导入时异常、类型问题或测试逻辑错误,所以很适合放在单元测试之前做快速门槛。若源码目录里混有生成文件,CI 里最好明确检查范围,避免把不该提交的 .py 也算进去。

如果只想把提交里的源码纳入检查,也可以用 -x 排除生成目录,例如:

python -m compileall -q -x '(^|/)(generated|vendor)/' src

不过它仍会写入 __pycache__;CI 工作目录通常无所谓,本地钩子若不想留下缓存,最好在临时副本里执行。这样既能控制范围,也不会把“语法检查通过”误当成完整测试。