pytest 在使用 __pycache__ 时隐藏警告

pytest hides warnings when __pycache__ is used

Pytest 警告在第一个和随后的 运行 之间是不同的。

janbet@ub/home/janbet $ cat test_x.py 
def test_1():
    a = '\d'
janbet@ub/home/janbet $ pytest test_x.py | tail -1
========================= 1 passed, 1 warning in 0.00s =========================
janbet@ub/home/janbet $ pytest test_x.py | tail -1
============================== 1 passed in 0.00s ===============================

警告在 rm -r __pycache__touch test_x.py 或类似的东西后再次出现。

我想这些警告是在读取 .py 文件时创建的,而当 __pycache__ 可用且是最新的时,根本不会读取它们。这是正确的吗?

有什么简单的方法可以强制 pytest 完全不使用 __pycache__ 吗?这可能不是很重要,但我强烈反对我的测试 运行 结果取决于之前 运行 期间创建或未创建的某些内部文件的情况。

对于这个特定的警告,这与 python 的工作方式一致——无效的转义序列警告仅在编译源代码时被忽略(之后,pyc 文件可用并且不参考源代码)

你可以设置PYTHONDONTWRITEBYTECODE=1环境变量来防止pyc写,但是这样你就得应付反复编译代码启动慢的代价

我建议使用 linter 来检测此问题(例如 flake8 在默认情况下通过 pycodestyle 检测此问题)and/or 一个自动修复程序来修复此问题(例如 pyupgrade fixes this


免责声明:我是 pytest 的核心开发人员,我是 flake8 的当前维护者,我是 pycodestyle 的维护者,我创建了 pyupgrade