Как выгрузить (перезагрузить) модуль Python? - PullRequest
717 голосов
/ 13 января 2009

У меня есть долго работающий сервер Python, и я хотел бы иметь возможность обновить службу без перезапуска сервера. Какой лучший способ сделать это?

if foo.py has changed:
    unimport foo  <-- How do I do this?
    import foo
    myfoo = foo.Foo()

Ответы [ 18 ]

7 голосов
/ 08 мая 2010

Для таких, как я, которые хотят выгрузить все модули (при запуске в интерпретаторе Python под Emacs ):

   for mod in sys.modules.values():
      reload(mod)

Больше информации в Перезагрузка модулей Python .

5 голосов
/ 09 января 2016

Enthought Traits имеет модуль, который достаточно хорошо работает для этого. https://traits.readthedocs.org/en/4.3.0/_modules/traits/util/refresh.html

Он перезагрузит любой модуль, который был изменен, и обновит другие модули и экземпляры, которые его используют. Он не работает большую часть времени с __very_private__ методами и может подавить наследование классов, но это избавляет меня от сумасшедших затрат времени от необходимости перезапускать хост-приложение при написании PyQt-интерфейса или вещи, которые запускаются внутри таких программ, как Maya или нук. Это не работает, может быть, 20-30% времени, но все равно невероятно полезно.

Пакет Enthought не перезагружает файлы в тот момент, когда они меняются - вы должны вызывать его явно - но это не должно быть так сложно реализовать, если вам это действительно нужно

4 голосов
/ 17 мая 2018

Те, кто использует Python 3 и перезагружаются из importlib.

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

3 голосов
/ 08 мая 2018

Другой вариант. Обратите внимание, что Python по умолчанию importlib.reload просто повторно импортирует библиотеку, переданную в качестве аргумента. не будет перезагружать библиотеки, которые импортирует ваша библиотека. Если вы изменили много файлов и у вас есть несколько сложный пакет для импорта, вы должны выполнить глубокую перезагрузку .

Если у вас установлен IPython или Jupyter , вы можете использовать функцию для глубокой перезагрузки всех библиотек:

from IPython.lib.deepreload import reload as dreload
dreload(foo)

Если у вас нет Jupyter, установите его с помощью этой команды в вашей оболочке:

pip3 install jupyter
3 голосов
/ 01 февраля 2018

2018-02-01

  1. модуль foo должен быть успешно импортирован заранее.
  2. from importlib import reload, reload(foo)

31,5. importlib - Реализация импорта - Документация Python 3.6.4

1 голос
/ 05 февраля 2016

для меня для случая Abaqus это так, как это работает. Представьте, что ваш файл Class_VerticesEdges.py

sys.path.append('D:\...\My Pythons')
if 'Class_VerticesEdges' in sys.modules:  
    del sys.modules['Class_VerticesEdges']
    print 'old module Class_VerticesEdges deleted'
from Class_VerticesEdges import *
reload(sys.modules['Class_VerticesEdges'])
0 голосов
/ 09 ноября 2017

У меня было много проблем при попытке перезагрузить что-то внутри Sublime Text, но, наконец, я смог написать эту утилиту для перезагрузки модулей в Sublime Text на основе кода, который sublime_plugin.py использует для перезагрузки модулей.

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

def reload_module(full_module_name):
    """
        Assuming the folder `full_module_name` is a folder inside some
        folder on the python sys.path, for example, sys.path as `C:/`, and
        you are inside the folder `C:/Path With Spaces` on the file 
        `C:/Path With Spaces/main.py` and want to re-import some files on
        the folder `C:/Path With Spaces/tests`

        @param full_module_name   the relative full path to the module file
                                  you want to reload from a folder on the
                                  python `sys.path`
    """
    import imp
    import sys
    import importlib

    if full_module_name in sys.modules:
        module_object = sys.modules[full_module_name]
        module_object = imp.reload( module_object )

    else:
        importlib.import_module( full_module_name )

def run_tests():
    print( "\n\n" )
    reload_module( "Path With Spaces.tests.semantic_linefeed_unit_tests" )
    reload_module( "Path With Spaces.tests.semantic_linefeed_manual_tests" )

    from .tests import semantic_linefeed_unit_tests
    from .tests import semantic_linefeed_manual_tests

    semantic_linefeed_unit_tests.run_unit_tests()
    semantic_linefeed_manual_tests.run_manual_tests()

if __name__ == "__main__":
    run_tests()

Если вы запускаете в первый раз, это должно загрузить модуль, но если позже вы сможете снова запустить метод / функцию run_tests(), он перезагрузит тестовые файлы. С Sublime Text (Python 3.3.6) это часто случается, потому что его интерпретатор никогда не закрывается (если вы не перезапустите Sublime Text, то есть интерпретатор Python3.3).

0 голосов
/ 12 февраля 2015

Другим способом может быть импорт модуля в функцию. Таким образом, когда функция завершает работу, модуль получает мусор.

...