【问题标题】:How to reload Python module in IDLE?如何在 IDLE 中重新加载 Python 模块?
【发布时间】: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 也会重新启动您的会话。

标签: python module reload python-idle


【解决方案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 快捷键来重新启动并加载最新版本的模块

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2010-10-01
      • 2012-10-19
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      相关资源
      最近更新 更多