为什么Python有时会忽略源文件而转而使用pyc文件?

时间:2019-05-10 08:43:21

标签: python subprocess filesystems

我遇到了这样的情况:我迅速更改了磁盘上的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的错误/功能?

1 个答案:

答案 0 :(得分:1)

不需要特殊的冲洗,但是除了禁用或删除.pyc之外,睡眠是唯一的答案:.pyc的出现不会比{{ 1}},如果两次编写之间经过的时间足够短。 “足够小”取决于文件系统和操作系统,但很可能很短时间就是一秒钟。