如何在使用“python -i”交互解释时重载我的Python源文件

17 投票
3 回答
19251 浏览
提问于 2025-04-16 16:27

在写或者调试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是内置的,所以你可以直接去掉第一行。

撰写回答