10
$ 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

4 回答 4

19

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

如果一个模块使用 from ... import ... 从另一个模块导入对象,则为另一个模块调用 reload() 不会重新定义从它导入的对象 - 解决此问题的一种方法是重新执行 from 语句,另一种是改为使用导入和限定名称(module.name

因此,您应该执行以下操作:

from myapp import *
....
import myapp
reload(myapp)
from myapp import *
于 2012-05-01T17:21:18.640 回答
3

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

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

import myapp
reload(myapp)

您也可以直接从sys.modules.

import sys
reload(sys.modules["myapp]")
于 2012-05-01T17:22:00.100 回答
3

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

你不能。这就是为什么使用from X import *是一个坏主意的原因之一。

于 2012-05-01T17:16:29.840 回答
1

为了澄清 Wooble 的评论,使用“from foo import *”将 foo 中的所有内容带入当前命名空间。这可能导致名称冲突(您无意中为已使用的名称分配了一个新值),并且还可能使您更难分辨某物的来源。虽然一些库经常以这种方式使用,但它通常会导致比其价值更多的问题。

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

于 2012-05-01T17:30:16.083 回答