В продолжение этот вопрос у меня есть новый вопрос:
Что происходит внутри os.remove(module_name)
и del sys.modules["module_name"]
?
В продолжение этот вопрос у меня есть новый вопрос:
Что происходит внутри os.remove(module_name)
и del sys.modules["module_name"]
?
Короткий ответ: os.remove(module_name)
удалит файл из файловой системы. del sys.modules["module_name"]
удалит модуль из кэша ранее загруженных модулей, поддерживаемых текущим интерпретатором Python.
В Python, когда вы импортируете модуль, интерпретатор проверяет, существует ли файл .pyc
с тем же именем, что и файл .py
, который вы пытаетесь импортировать. Если есть, и если файл .py
не изменился с момента импорта файла .pyc
, то Python загрузит файл .pyc
(что значительно быстрее).
Если файл .pyc
не существует или файл .py
был изменен с момента создания файла .pyc
, загружается файл .py
и создается новый файл .pyc
. (Стоит отметить, что простой запуск файла Python, скажем, test.py
не приведет к созданию test.pyc
. Это происходит только при import
ing модулях.)
sys.modules
совсем другое дело. Чтобы ускорить код, который дважды импортирует один и тот же модуль, Python поддерживает список модулей, которые были импортированы во время текущего сеанса интерпретатора. Если импортируемый модуль находится в sys.modules
, то будет прочитана кешированная версия (ни .py
, ни .pyc
файлы на диске проверяться не будут). Python предоставляет встроенную функцию reload()
, которая позволяет обойти кеш модуля и принудительно перезагрузить с диска.
Чтобы получить дополнительную информацию о системе модулей Python, см. документацию по модулям а>.
Я запускаю много таких приложений
import os
os.system('attrib +H *.pyc /S')
В Windows это скрывает любые видимые скомпилированные файлы при запуске приложения - они дают мне пипсы.
мой oneliner для этой работы:
find . -name *.pyc |xargs rm
NB: вам нужен Linux (или Unix-подобная ОС)