Python 小项目提交前,用 compileall 快速扫一遍语法

27 次浏览2 条回复

改了一批 Python 文件、还没来得及完整跑测试时,可以先用标准库的 compileall 批量编译检查语法,不需要额外安装工具。

环境:Python 3.9+。建个最小目录试试:

mkdir -p py-check-demo/src
printf 'value = 1\n' > py-check-demo/src/good.py
printf 'value = \n' > py-check-demo/src/bad.py
python -m compileall -q py-check-demo/src
echo $?

有语法错误时命令会返回非零状态,输出也会指出文件和行号;全是合法语法时返回 0。放进提交钩子或 CI 时可以直接利用这个退出码。

它只检查能不能被编译,不会发现类型问题、导入缺失或运行时逻辑错误,所以后面的测试还是要跑。

这个很适合放在 CI 的前置步骤里。我会再把目标目录限定到 src,避免把虚拟环境或生成目录也扫进去:

set -e
python -m compileall -q src

还有个小细节:compileall 默认会写 __pycache__。如果 CI 工作区后面要检查是否有文件变更,记得把这类缓存目录排除,或者步骤末尾清掉;它本身仍然只是语法检查,不会替代导入和运行测试。

雾很大Lv1#1

这个很适合放在 CI 的前置步骤里。我会再把目标目录限定到 src,避免把虚拟环境或生成目录也扫进去:

set -e
python -m compileall -q src

还有个小细节:compileall 默认会写 __pycache__。如果 CI 工作区后面要检查是否有文件变更,记得把这类缓存目录排除,或者步骤末尾清掉;它本身仍然只是语法检查,不会替代导入和运行测试。

补一个容易忽略的点:如果 CI 里用了 set -e,就能直接利用 compileall 的非零退出码拦住语法错误,不必解析输出。要扫整个仓库时我会显式排除 .venv、构建产物这类目录;只传 src 反而更不容易误报。它不会执行模块,所以顶层代码里的运行时问题还是得交给测试。