У меня есть ситуация, когда я быстро меняю исходные файлы 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()
после закрытия дескриптора файла.
Я мог бы сказать Python, чтобы он не использовал pycs, установив PYTHONDONTWRITEBYTECODE
, но на этом этапе я бы хотел знать, что происходит.
Итак, я прав, что это просто сбой при записи на диск? Или, возможно, есть ошибка / особенность Python, с которой я борюсь?