重新加载Python解释器

时间:2012-05-01 17:11:44

标签: python interpreter reload

$ python
>>> import myapp
>>> reload(myapp)
<module 'myapp' from 'myapp.pyc'>
>>>

CTRL + d

$ python
>>> from myapp import *
>>> reload(myapp)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'myapp' is not defined

为什么这种行为有所不同?使用from myapp import *时如何重新加载?

4 个答案:

答案 0 :(得分:19)

来自http://docs.python.org/library/functions.html#reload

  

如果模块使用from ... import从另一个模块导入对象   ...,为其他模块调用reload()不会重新定义   从它导入的对象 - 解决这个问题的方法是重新执行   从声明,另一个是使用导入和限定名称   (模块。名称)代替。

所以,你应该这样做:

from myapp import *
....
import myapp
reload(myapp)
from myapp import *

答案 1 :(得分:3)

  

使用from myapp import *时如何重新加载?

你做不到。这是使用from X import *是一个坏主意的原因之一。

答案 2 :(得分:3)

对于from myapp import *,您没有在变量名中引用模块,因此不能使用变量名来引用模块。

当然,没有什么可以阻止您再次导入它以获取您可以使用的名称中对模块的引用。由于它已被导入一次,因此实际上不会再次导入:

import myapp
reload(myapp)

您也可以直接从sys.modules获取参考。

import sys
reload(sys.modules["myapp]")

答案 3 :(得分:1)

澄清Wooble的评论,使用&#34;来自foo import *&#34;将foo中的所有内容带入当前命名空间。这可能会导致名称冲突(您无意中将新值分配给已使用的名称),并且还可能更难以确定某些内容来自何处。虽然通常以这种方式使用一些库,但它通常会导致更多的问题而不是它的价值。

此外,由于它已被带入当前命名空间,因此无法简单地重新加载。通常最好将它保存在一个单独的命名空间中(可能使用更简单的方便别名,比如m)。这允许你重新加载(这对测试很有用,但在测试之外很少有好主意)并且有助于保持命名空间纯粹。