Почему Python иногда игнорирует исходные файлы в пользу pyc-файлов? - PullRequest
3 голосов
/ 10 мая 2019

У меня есть ситуация, когда я быстро меняю исходные файлы 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, с которой я борюсь?

1 Ответ

1 голос
/ 10 мая 2019

Специальная очистка не требуется, но кроме отключения или удаления .pyc, единственным ответом является сон: .pyc не появляется старше , чем .py, если истекло времямежду написанием их достаточно мало.«Достаточно маленький» зависит от файловой системы и ОС, но может легко занять целую секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...