Как повторно импортировать обновленный пакет в Python Interpreter?

Я часто тестирую свой модуль в Python Interpreter, и когда я вижу ошибку, я быстро обновляю файл .py. Но как мне задуматься об интерпретаторе? Таким образом, я давно покидал и возвращал Interpreter, потому что повторный импорт файла снова не работает для меня.

11 Solutions collect form web for “Как повторно импортировать обновленный пакет в Python Interpreter?”

«Перезагрузка больше не является функцией в Python 3. Вместо этого используйте imp.reload (), скопированную из комментариев.

Используйте встроенную функцию reload :

https://docs.python.org/2/library/functions.html#reload

Когда выполняется reload(module) :

  • Код модулей Python перекомпилируется, а код модуля-уровня повторно выполняется, определяя новый набор объектов, привязанных к именам в словаре модуля. Функция init модулей расширения не вызывается второй раз.
  • Как и все другие объекты в Python, старые объекты восстанавливаются только после того, как их отсчеты ссылок упадут до нуля.
  • Имена в пространстве имен модулей обновляются, чтобы указывать на любые новые или измененные объекты.
  • Другие ссылки на старые объекты (например, имена, внешние по отношению к модулю) не восстанавливаются, чтобы ссылаться на новые объекты и должны обновляться в каждом пространстве имен, где они встречаются, если это необходимо.

Пример:

 # Make a simple function that prints "version 1" shell1$ echo 'def x(): print "version 1"' > mymodule.py # Run the module shell2$ python >>> import mymodule >>> mymodule.x() version 1 # Change mymodule to print "version 2" (without exiting the python REPL) shell2$ echo 'def x(): print "version 2"' > mymodule.py # Back in that same python session >>> reload(mymodule) <module 'mymodule' from 'mymodule.pyc'> >>> mymodule.x() version 2 

Все ответы выше о reload () или imp.reload () устарели.

reload () больше не является встроенной функцией в python 3 и imp.reload () отмечен устаревшим (см. справку (imp)).

importlib.reload() этого лучше использовать importlib.reload() .

Таким образом, я давно покидал и возвращал Interpreter, потому что повторный импорт файла снова не работает для меня.

Да, просто повторение import снова дает вам существующую копию модуля из sys.modules .

Вы можете сказать reload(module) чтобы обновить sys.modules и получить новую копию этого единственного модуля, но если какие-либо другие модули имеют ссылку на исходный модуль или любой объект из исходного модуля , они будут хранить свои старые ссылки и Very Смущающие вещи произойдут.

Поэтому, если у вас есть модуль a , который зависит от модулей b и b , вам нужно «перезагрузить b», а затем «перезагрузить a». Если у вас есть два модуля, которые зависят друг от друга, что чрезвычайно распространено, когда эти модули являются частью одного и того же пакета, вы не можете перезагрузить их оба: если вы перезагрузите pa он получит ссылку на старый pb , и наоборот. Единственный способ сделать это – выгрузить их обоих сразу, удалив их элементы из sys.modules , прежде чем импортировать их снова. Это нехорошо и имеет некоторые практические ошибки, связанные с вложением модулей, которые являются None, как маркер с несоответствующим значением.

И если у вас есть модуль, который передает ссылки на его объекты на системные модули – например, он регистрирует кодек или добавляет обработчик предупреждений – вы застряли; вы не можете перезагрузить системный модуль, не запутав остальную среду Python.

В заключение: для всех, кроме простейшего случая, когда один автономный модуль загружается одним автономным скриптом, reload() очень сложно получить право; если, как вы подразумеваете, вы используете «пакет», вам, вероятно, будет лучше продолжать цикл перевода.

В Python 3 поведение меняется.

 >>> import my_stuff 

… сделайте что-нибудь с my_stuff, а затем:

 >>>> import imp >>>> imp.reload(my_stuff) 

и вы получаете совершенно новый, перезагруженный my_stuff.

Независимо от того, сколько раз вы импортируете модуль, вы получите ту же копию модуля из sys.modules которая была загружена с первого import mymodule

Я отвечаю на это поздно, так как каждый из вышеупомянутых / предыдущих ответов имеет немного ответа, поэтому я пытаюсь суммировать все это в одном ответе.

Использование встроенной функции :

Для Python 2.x – используйте встроенную функцию reload(mymodule) .

Для Python 3.x – используйте imp.reload(mymodule) .

Для Python 3.4 – В Python 3.4 imp был устаревшим в пользу importlib ie importlib.reload(mymodule)

Немного оговорок :

  • Как правило, не очень полезно перезагружать встроенные или динамически загружаемые модули. Перезагрузка sys , __main__ , builtins и других ключевых модулей не рекомендуется.
  • Во многих случаях модули расширения не предназначены для инициализации более одного раза и могут перезагружаться произвольными способами. Если модуль импортирует объекты из другого модуля, используя … import …, вызов reload() для другого модуля не переопределяет объекты, импортированные из него – одним из способов является повторное выполнение оператора from , другое – вместо этого использовать import и квалифицированные имена (module.name).
  • Если модуль создает экземпляры класса, перезагрузка модуля, который определяет класс, не влияет на определения методов экземпляров – они продолжают использовать старое определение класса. То же самое верно для производных классов.

Внешние пакеты :

reimport – Reimport в настоящее время поддерживает Python 2.4 до 2.7.

xreload – Это работает, выполняя модуль в пространстве имен царапин, а затем исправляя классы, методы и функции на месте. Это позволяет избежать необходимости исправления экземпляров. Новые объекты копируются в целевое пространство имен.

livecoding – перезагрузка кода позволяет запущенному приложению изменять свое поведение в ответ на изменения в сценариях Python, которые он использует. Когда библиотека обнаруживает, что скрипт Python был изменен, он перезагружает этот скрипт и заменяет объекты, которые он ранее сделал доступными для использования с новыми перезагруженными версиями. В качестве инструмента он позволяет программисту избежать прерывания рабочего процесса и соответствующей потери фокуса. Это позволяет им оставаться в состоянии потока. Если раньше им потребовалось перезапустить приложение для внесения измененного кода, эти изменения могут быть применены немедленно.

Короткий ответ:

попробуйте использовать reimport: полнофункциональную перезагрузку для Python .

Более длинный ответ:

Похоже, что этот вопрос был задан / ответил до выхода реимпорта , который сам по себе считается «полнофункциональной перезагрузкой для Python»:

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

В настоящее время Reimport поддерживает Python с 2.4 по 2.6.

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

Примечание. Хотя reimport явно поддерживает Python с 2.4 по 2.6, я пробовал его на 2,7, и, похоже, он работает нормально.

В основном перезагрузка, как в allyourcode's asnwer. Но это не изменит базовый код уже созданного объекта или ссылочных функций. Продолжая свой ответ:

 #Make a simple function that prints "version 1" shell1$ echo 'def x(): print "version 1"' > mymodule.py # Run the module shell2$ python >>> import mymodule >>> mymodule.x() version 1 >>> x = mymodule.x >>> x() version 1 >>> x is mymodule.x True # Change mymodule to print "version 2" (without exiting the python REPL) shell2$ echo 'def x(): print "version 2"' > mymodule.py # Back in that same python session >>> reload(mymodule) <module 'mymodule' from 'mymodule.pyc'> >>> mymodule.x() version 2 >>> x() version 1 >>> x is mymodule.x False 

Не уверен, что это все ожидаемые вещи, но вы можете сделать так:

 >>> del mymodule >>> import mymodule 

См. Здесь, чтобы получить хорошее объяснение того, как ваши зависимые модули не будут перезагружены и какие эффекты могут иметь:

http://pyunit.sourceforge.net/notes/reloading.html

Путь решения был направлен на отслеживание зависимых модулей путем переопределения __import__, а затем для удаления каждого из них из sys.modules и повторного импорта. Возможно, они, возможно, просто перезагрузили их.

 import sys del sys.modules['module_name'] 

Ответ стрекозы работал для меня (python 3.4.3).

 import sys del sys.modules['module_name'] 

Вот решение более низкого уровня:

 exec(open("MyClass.py").read(), globals()) 
  • Загрузка Python и сервера
  • Проверьте, пересекаются ли два адреса CIDR?
  • Итерации по всем комбинациям значений в нескольких списках в python
  • Как отправить электронное письмо из сценария Python, который запускается в «Google App Engine»?
  • Как я могу создать каталоги рекурсивно?
  • Перемещение и изменение древовидного списка структуры dict
  • Ошибка: нет такого файла или каталога: 'satu.txt'
  • Список только файлов в каталоге?
  • Python - лучший язык программирования в мире.