Мне кажется, я знаю, что происходит.Новый механизм импорта Python 3 кэширует имена файлов, которые он находит в каталогах.Он перезагрузит кэш, когда mtime
, время изменения каталога, изменится.
См. Реализацию метода importlib._bootstrap_external.FileFinder.find_spec()
, которая содержит:
try:
mtime = _path_stat(self.path or _os.getcwd()).st_mtime
except OSError:
mtime = -1
if mtime != self._path_mtime:
self._fill_cache()
self._path_mtime = mtime
Здесь _path_stat
- это просто вызов os.stat()
, но локализованный, чтобы избежать импорта.Метод _fill_cache()
выполняет вызов os.listdir()
.
В некоторых файловых системах Windows разрешение mtime
общеизвестно низкое, до 2 секунд.В вашем случае разрешение, по-видимому, все еще достаточно низкое, чтобы кеш не обновлялся до , а к тому времени, когда вы пытаетесь загрузить второй модуль.Хотя файловая система NTFS может записывать время с шагом 100 нс, на практике ограничивающим фактором, по-видимому, являются системные часы Windows, которые, как я понимаю, обычно ограничены разрешением 15 мс.Так что если вы пишете print2.py
в течение 15 мс после написания print1.py
, то Python не заметит.
Python действительно дает вам возможность очистить этот кеш;используйте метод importlib.invalidate_caches()
;это приведет к сбросу атрибута _path_mtime
в экземпляре FileFinder
обратно на -1
, что приведет к новому вызову _fill_cache()
.
Как указано в документации по функции:
ThisФункция должна вызываться, если какие-либо модули создаются / устанавливаются во время работы вашей программы, чтобы гарантировать, что все искатели заметят существование нового модуля.