Как перезагрузить исходный файл 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 *