Что работает: у меня есть пакет version_info
, в котором я определяю строку version_info
. Когда я увеличиваю version_info.version_info
, основной код печатает увеличенное значение после reload
.
Что не работает: когда я увеличиваю значение version_info_sub.py
, оно не обновляется reload
.
Я подозреваю, что importlib.reload
не соответствует утверждению from .sub import version_info_sub
.
Как я могу добиться, чтобы значение sub.py
также перезагружалось?
Основной код:
from importlib import reload
import version_info
...
reload(version_info)
print(version_info.version_string) # successfully updated
print(version_info.version_info_sub) # stays on the old value
версия_информация/__init__.py:
from .sub import version_info_sub
version_string = "6"
информация_версии/sub.py:
version_info_sub = "6"
Я думаю в version_info/__init__.py
ты не хотел писать version_string = "6"
, да? извините, если я ошибаюсь.
Проблема в том, что Python копирует переменные и их значения в модуль, в который вы импортируете. Это означает, что когда вы перезагружаете только version_info
, вы просто возвращаете старое значение. Простое решение этой проблемы — сначала перезагрузить подмодуль.
reload(version_info.sub)
reload(version_info)
Думаю, я понял твою проблему.
Я сделал для вас функцию reload_package.
import inspect
def reload_package(package_):
modules_names_paths = inspect.getmembers(package_, inspect.ismodule)
modules_names = [x[0] for x in modules_names_paths]
for module_name in modules_names:
module_ = getattr(package_, module_name)
reload(module_)
reload(package_)
Проблема в том, что вы перезагружаете пакет, но подмодуль не перезагружается.
Вы также можете перезагрузить саб.
Но чтобы быть независимым (я думаю, вызывающему абоненту не обязательно знать о «sub») вам придется перебрать модули в пакете, перезагрузить их, а затем перезагрузить пакет.
Эта функция подойдет.
Счастливого кодирования
Modules_names_paths содержит имя и путь для каждого элемента. Поэтому мне пришлось очистить пути и оставить только имена в нулевом индексе [0].
Под «приращением» вы имеете в виду редактирование исходного файла вручную? Что происходит в первом фрагменте на
...
? Это простоinput()
для приостановки выполнения или что-то еще?