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

Eri*_*son 12 python module reload python-idle

我试图了解我的工作流程如何与Python和IDLE一起使用.

假设我写了一个函数:

def hello():
    print 'hello!'
Run Code Online (Sandbox Code Playgroud)

我把文件保存为greetings.py.然后在IDLE中,我测试了这个函数:

>>> from greetings import *
>>> hello()
hello!
Run Code Online (Sandbox Code Playgroud)

然后我改变了程序,并想再试hello()一次.所以我reload:

>>> reload(greetings)
<module 'greetings' from '/path/to/file/greetings.py'>
Run Code Online (Sandbox Code Playgroud)

然而,这种变化并未得到改善.我究竟做错了什么?如何重新加载更改的模块?

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

Jac*_*nda 12

你需要重做这一行:

>>> from greetings import *

你做完之后

>>> reload(greetings)

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

>>> import greetings
>>> greetings.hello()
hello!
Run Code Online (Sandbox Code Playgroud)

更改文件

>>> reload(greetings)
<module 'greetings' from 'greetings.py'>
>>> greetings.hello()
world!
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 5

这是我在尝试你的例子时得到的结果(来自一个新的Python交互式会话):

>>> from greetings import *
>>> reload(greetings)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'greetings' is not defined
Run Code Online (Sandbox Code Playgroud)

这表明问题的根源.使用时from greetings import *,名称greetings不会导入全局命名空间.因此,你不能使用reload(greetings)它.

要解决此问题,请尝试以下操作:

>>> import greetings
>>> greetings.hello()
hello
>>> reload(greetings)
<module 'greetings' from 'greetings.pyc'>
>>> greetings.hello()
hello world
Run Code Online (Sandbox Code Playgroud)

  • 我想在他的例子中,他遗漏了这样一个事实:他既做了导入的问候,又从问候导入*,所以他上面的例子适合他.在这种情况下,单独重新加载问候语不会导致调用hello()更新,即使调用greetings.hello()也能正常工作. (2认同)