Как перезагрузить модули в Python?

У меня есть 2 самоопределенных пакета pac1 и pac2 . Я использовал для импорта всех модулей один за другим и перезагружал их один за другим после изменения, например:

 from pac1 import mod1 from pac1 import mod2 from pac1 import mod3 from pac2 import mod4 from pac2 import mod5 reload(mod1) reload(mod2) reload(mod3) reload(mod4) reload(mod5) 

Теперь я узнаю, что могу импортировать модули и улучшать коды:

 from pac1 import * from pac2 import * reload(mod1) reload(mod2) reload(mod3) reload(mod4) reload(mod5) 

Но это лучшее, что я могу сделать? Я имею в виду, могу ли я перезагрузить все пакеты за один раз?

UPDATE1 : Я постоянно изменяю эти модули. Поэтому после их импорта в начале тестирования мне может потребоваться часто перезагружать модифицированные модули, чтобы отразить изменения. Это стимул для меня перезагрузить модули.

UPDATE2 : этот процесс не обязательно выполняется динамически. Я просто хочу сделать мой код более кратким, сплавляя все эти reload() в один.

В sys.modules есть глобальный список модулей (на самом деле это dict). Если вы хотите перезагрузить каждый модуль, который находится в глобальном пространстве имен, попробуйте следующее:

 import sys,imp def reloader(globaldict): reloadkeys = set(globaldict)&set(sys.modules) for key in reloadkeys: if imp.is_builtin(key) == 0: reload(sys.modules[key]) reloader(locals()) 

Или, если вы хотите отслеживать себя, просто создайте свой собственный список модулей mymodules и добавьте к нему каждый модуль после его импорта. Затем вы можете использовать цикл для перезагрузки каждого из них.


Вот способ, который позволяет избежать перезагрузки встроенных систем без изучения globals :

 import sys,imp def reloader(globaldict): for key in sys.modules: if imp.is_builtin(key) == 0: reload(sys.modules[key]) 

Кроме того, вы можете захватить состояние sys.modules сразу после запуска интерпретатора и исключить их из своей перезагрузки, используя аналогичные логические операции.

Вы можете попробовать что-то вроде этого

В качестве альтернативы вы можете посмотреть, как это делает Werkzeug (Flask), похоже, что в любом случае он использует subprocess для вызова самого себя или основной части кода.

Предполагая, что вам действительно нужно перезагрузить их, способ, которым вы это делаете, лучше всего, потому что он явный (и явный лучше, чем неявный). Это дает понять, что происходит (тем более, что это не нормальная ситуация)

Если вам действительно нужно сделать это динамически, вы можете попробовать что-то вроде этого:

 import types for k, v in globals().items(): if not (k.startswith('__') and k.endswith('__')): if isinstance(v, types.ModuleType): reload(v)