Как перезагрузить Python-модуль, импортированный с помощью `from module import *` - PullRequest
42 голосов
/ 01 апреля 2011

Я видел в этот полезный вопрос и ответ , который можно использовать reload(whatever_module) или, в Python 3, imp.reload(whatever_module).

Мой вопрос: что если бы я сказал from whatever_module import * об импорте? Тогда у меня нет whatever_module для ссылки, когда я использую reload(). Ребята, вы будете кричать на меня за то, что я выбросил целый модуль в глобальное пространство имен? :)

Ответы [ 7 ]

45 голосов
/ 30 июля 2012

Я согласен с "не делайте этого вообще" консенсус, но ...

Правильный ответ:

import X
reload(X)
from X import Y  # or * for that matter
8 голосов
/ 01 апреля 2011

Никогда не используйте import *; разрушает читабельность.

Также помните, что перезагрузка модулей практически никогда не бывает полезной. Вы не можете предсказать, в каком состоянии окажется ваша программа после перезагрузки модуля, поэтому это отличный способ получить непонятные, невоспроизводимые ошибки.

4 голосов
/ 10 июня 2011

A

from module import *

берет все «экспортированные» объекты из module и связывает их с именами уровня модуля (или независимо от того, какой у вас был уровень). Вы можете перезагрузить модуль как:

reload(sys.modules['module'])

но это не принесет вам никакой пользы: имена независимо от того, какой у вас объем был, все еще указывают на старые объекты.

2 голосов
/ 01 августа 2018

Более чистый ответ - это сочетание хорошего ответа Катскула и использования Охадом Коэном sys.module и прямого переопределения:

import sys
Y = reload(sys.module["X"]).Y  # reload() returns the new module

Фактически, выполнение import X создает новый символ (X)это может быть переопределено в следующем коде, который не является необходимым (тогда как sys является общим модулем, поэтому этого не должно происходить).

Интересно, что from X import Y не добавляет X в пространство имен, но добавляет модуль X в список известных модулей (sys.modules), что позволяет перезагрузить модуль (и получить доступ к его новому содержимому).

В более общем случае, если несколько импортированныхСимволы необходимо обновить, тогда удобнее импортировать их так:

import sys
reload(sys.module["X"])  # No X symbol created!
from X import Y, Z, T
0 голосов
/ 28 декабря 2018

для питона 3.7:

from importlib import reload #import function "reload"
import YourModule #import your any modules
reload(YourModule) #reload your module

Функция перезагрузки может быть вызвана из вашей собственной функции

def yourFunc():
   reload(YourModule)
0 голосов
/ 06 ноября 2017
import re

for mod in sys.modules.values():
    if re.search('name', str(mod)):
        reload(mod)
0 голосов
/ 19 августа 2017

При импорте с использованием from whatever_module import whatever, whatever считается частью модуля импорта, поэтому для его перезагрузки вам необходимо перезагрузить модуль.Но просто перезагрузив свой модуль, вы все равно получите старый whatever - из уже импортированного whatever_module, поэтому вам нужно перезагрузить (what_module) и затем перезагрузить свой модуль:используется from whatever_module import whatever вы также можете рассмотреть

whatever=reload(sys.modules['whatever_module']).whatever

или

whatever=reload(whatever_module).whatever
...