为什么 Python 有时会忽略源文件而选择 pyc 文件?

Why does Python ignore source files in favor of pyc files sometimes?

我有这样一种情况,我快速更改磁盘上的 Python 源文件,并且对于每次更改,运行 它们与子进程中的 Python (它用于突变测试工具)。我发现在某些情况下,Python 子进程要么看不到更改,要么忽略它以支持 __pycache__ 的内容。这是一个例子:

from pathlib import Path
import subprocess

workspace = Path('workspace')
workspace.mkdir(exist_ok=True)

for i in range(3):
    with open(workspace / 'code.py', mode='wt') as f:
        f.write(f"print({i})")
    proc = subprocess.run(
        'python -m code'.split(),
        stdout=subprocess.PIPE,
        cwd='workspace')
    print(i, proc.stdout.decode('utf-8').strip()) 

我希望打印出来:

0 0
1 1
2 2

但通常它会打印如下内容:

0 0 
1 0
2 0

0 0
1 1
2 1

也就是说,在某些时候,Python 子进程看不到我正在写入磁盘的更改。

我尝试了各种尝试,通过文件句柄上的 os.fsyncflush() 等将更改刷新到磁盘。唯一似乎有所不同的是在文件句柄关闭后放置大量 time.sleep()

可以通过设置PYTHONDONTWRITEBYTECODE告诉Python不要使用pycs,但此时我想知道发生了什么。

所以,我说这只是刷新到磁盘的一些失败,对吗?还是我正在与 Python 中的 bug/feature 战斗?

不需要特殊的冲洗,但除了禁用或删除 .pyc 之外,睡眠是唯一的答案:.pyc 不会出现 older.py 如果写入它们之间的时间足够短。 “足够小”取决于文件系统和 OS,但很可能是一整秒。