如何在IDLE中重新加载Python模块?
我正在尝试理解如何在Python和IDLE中进行我的工作流程。
假设我写了一个函数:
def hello():
print 'hello!'
我把这个文件保存为 greetings.py
。然后在IDLE中,我测试这个函数:
>>> from greetings import *
>>> hello()
hello!
接着我修改了程序,想再次尝试 hello()
。所以我选择 reload
:
>>> reload(greetings)
<module 'greetings' from '/path/to/file/greetings.py'>
但是修改的内容没有生效。我哪里做错了?我该如何重新加载一个修改过的模块?
我在StackOverflow上阅读了一些相关的问题,但没有一个答案对我有帮助。
4 个回答
1
IDLE有一个菜单选项可以运行当前的文件。选择这个选项会先运行你的文件,然后重新启动命令行界面。
5
这是我在一个新的Python交互式会话中尝试你的例子时得到的结果:
>>> from greetings import *
>>> reload(greetings)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'greetings' is not defined
这说明了问题的来源。当你使用 from greetings import *
时,greetings
这个名字并没有被导入到全局命名空间中。因此,你不能对它使用 reload(greetings)
。
要解决这个问题,可以尝试以下方法:
>>> import greetings
>>> greetings.hello()
hello
>>> reload(greetings)
<module 'greetings' from 'greetings.pyc'>
>>> greetings.hello()
hello world
12
你需要重新做这一行:
>>> from greetings import *
在你执行
>>> reload(greetings)
之后。之所以单纯重新加载模块不管用,是因为这个 * 实际上已经把模块里的所有内容都导入了,所以你得单独重新加载那些内容。如果你这样做,结果就会像你预期的那样:
>>> import greetings
>>> greetings.hello()
hello!
对文件进行修改
>>> reload(greetings)
<module 'greetings' from 'greetings.py'>
>>> greetings.hello()
world!