Как перезагрузить исходный файл Python, когда он интерактивно интерпретирует его с помощью "python -i",
При написании или отладке программы Python мне очень нравится использовать переключатель командной строки -i
, чтобы иметь возможность напрямую проверять мои функции без необходимости запускать все от начала до конца.
Однако, когда я вношу изменения в код, мне нужно закрыть и перезапустить мой интерактивный сеанс, потеряв все временные переменные, которые я мог бы определить. Как перезагрузить исходный файл из интерпретатора python?
Встроенная функция reload
выглядит так, как будто она создана для этого, но я могу использовать ее только с именованными модулями:
>> import my_prog
>> print my_prog.x
-- prints an error, because x is not defined --
-- edited my_prog.py to add the x global now...
>> reload(my_prog)
>> print my_prog.x
-- prints x
Однако, если я вместо этого делаю from my_prog import *
в начале, перезагрузка не работает, и выполнение импорта снова также не имеет эффекта.
Ответы
Ответ 1
Это связано с тем, как Python кеширует модули. Вам необходимо передать объект модуля для перезагрузки и вам нужно повторить команду импорта. Может быть, есть лучший способ, но вот что я обычно использую: В Python 3:
>> from importlib import reload
>> import my_prog
>> from my_prog import *
*** Run some code and debug ***
>> reload(my_prog); from my_prog import *
*** Run some code and debug ***
>> reload(my_prog); from my_prog import *
В Python 2 перезагрузка встроена, поэтому вы можете просто удалить первую строку.
Ответ 2
Когда вы используете from my_prog import *
, вы перемещаете символы в глобальную область интерпретатора, поэтому reload()
не может изменять эти глобальные символы, только при обновлении и перезагрузке модуля будут изменены только атрибуты уровня модуля.
Например: myprog.py:
x = 1
В интерпретаторе:
>>> import myprog
>>> myprog.x
1
>>> from myprog import x
>>> x
1
Теперь отредактируйте myprog.py
настройку x = 2
:
>>> reload(myprog)
>>> myprog.x
2
>>> x
1
Повторите from myprog import *
, чтобы снова отобразить символы в глобальном масштабе:
>>> reload(myprog)
>>> from myprog import *