如何在使用“python -i”交互解释时重载我的Python源文件
在写或者调试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 *
的方式导入,那 reload 就不管用了,再次导入也没有任何效果。
3 个回答
0
我明白了。比如,我们可以用这个命令进入交互模式:
python3 -i filename.py
然后可以像这样使用importlib
包来重新加载它:
from importlib import reload
reload(filename) # Need no quotatiom mark
11
当你使用 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 *
25
这和Python是如何缓存模块有关。你需要一个模块对象来传递给reload函数,而且还需要重复执行导入命令。也许有更好的方法,但这是我通常使用的方式:
>> 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中,reload是内置的,所以你可以直接去掉第一行。