为什么 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.fsync
、flush()
等将更改刷新到磁盘。唯一似乎有所不同的是在文件句柄关闭后放置大量 time.sleep()
。
我可以通过设置PYTHONDONTWRITEBYTECODE
告诉Python不要使用pycs,但此时我想知道发生了什么。
所以,我说这只是刷新到磁盘的一些失败,对吗?还是我正在与 Python 中的 bug/feature 战斗?
不需要特殊的冲洗,但除了禁用或删除 .pyc
之外,睡眠是唯一的答案:.pyc
不会出现 older 比 .py
如果写入它们之间的时间足够短。 “足够小”取决于文件系统和 OS,但很可能是一整秒。
我有这样一种情况,我快速更改磁盘上的 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.fsync
、flush()
等将更改刷新到磁盘。唯一似乎有所不同的是在文件句柄关闭后放置大量 time.sleep()
。
我可以通过设置PYTHONDONTWRITEBYTECODE
告诉Python不要使用pycs,但此时我想知道发生了什么。
所以,我说这只是刷新到磁盘的一些失败,对吗?还是我正在与 Python 中的 bug/feature 战斗?
不需要特殊的冲洗,但除了禁用或删除 .pyc
之外,睡眠是唯一的答案:.pyc
不会出现 older 比 .py
如果写入它们之间的时间足够短。 “足够小”取决于文件系统和 OS,但很可能是一整秒。