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

Posted

技术标签:

【中文标题】如何在 IDLE 中重新加载 Python 模块?【英文标题】:How to reload Python module in IDLE? 【发布时间】:2011-09-08 05:31:59 【问题描述】:

我正在尝试了解我的工作流程如何使用 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'>

但更改没有被拾取。我究竟做错了什么?如何重新加载更改的模块?

我一直在阅读一些关于 SO 的相关问题,但没有一个答案对我有帮助。

【问题讨论】:

ctrl + f6 也会重新启动您的会话。 【参考方案1】:

你需要重做这一行:

&gt;&gt;&gt; from greetings import *

做完之后

&gt;&gt;&gt; reload(greetings)

只是重新加载模块不起作用的原因是因为 * 实际上导入了模块内的所有内容,因此您必须单独重新加载这些内容。如果您执行以下操作,它将按预期运行:

>>> import greetings
>>> greetings.hello()
hello!

更改文件

>>> reload(greetings)
<module 'greetings' from 'greetings.py'>
>>> greetings.hello()
world!

【讨论】:

【参考方案2】:

这是我在尝试您的示例时得到的结果(来自新的 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

【讨论】:

我认为在他的示例中,他忽略了导入问候语和从问候语导入 * 的事实,因此上面的示例对他有效。在这种情况下,单独重新加载问候语不会导致对 hello() 的调用被更新,即使对 greetings.hello() 的调用可以正常工作。 @Jacinda 你可能是对的,我已经尝试了很多东西,并试图提炼出重要的行为。 @FarmBoy 这是我以前遇到过的错误。在我意识到发生了什么之后,我总是有一种“哦,duh”的感觉。【参考方案3】:

IDLE 有一个菜单选择来运行当前文件。这将通过首先运行您的文件并重新加载它来重新启动 shell。

【讨论】:

或者你可以在文件编辑器(空闲)中按 f5 或使用 ctrl-f6。吨更容易【参考方案4】:

在 Windows 上,我使用 shell->Restart shell 或 CTRL+F6 快捷键来重新启动并加载最新版本的模块

【讨论】:

以上是关于如何在 IDLE 中重新加载 Python 模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中重新加载模块的函数?

如何在 shell 中重新运行 Python IDLE 中的程序?

如何在烧瓶中重新加载python模块?

脚本编译后如何在python中重新加载模块?

在python中重新加载模块

在 Python 3.4 中重新加载模块 [重复]