如何在IDLE中重新加载Python模块?

14 投票
4 回答
8596 浏览
提问于 2025-04-16 18:56

我正在尝试理解如何在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!

撰写回答