关于SO的重新导入有很多问题和答案,但如果不了解其背后的机制,这一切似乎都非常反直觉.
如果导入模块,更改内容,然后尝试再次导入,您会发现第二次导入无效:
>>> import foo # foo.py contains: bar = 'original'
>>> print foo.bar
original
>>> # edit foo.py and change to: bar = 'changed'
>>> import foo
>>> print foo.bar
original
Run Code Online (Sandbox Code Playgroud)
我发现时,我是一个非常开心的露营者reload:
>>> reload(foo)
>>> print foo.bar
changed
Run Code Online (Sandbox Code Playgroud)
但是,当您从模块导入项目而不导入模块本身时,没有简单的解决方案:
>>> from foo import baz
>>> print baz
original
>>> # change foo.py from baz = 'original' to baz = 'changed'
>>> from foo import baz
>>> print baz
original
>>> reload(foo)
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
reload(foo)
NameError: name 'foo' is not defined
Run Code Online (Sandbox Code Playgroud)
为什么Python不会在为其提供新import语句时更新导入的项目?
Mar*_*som 10
导入模块时,它将被缓存sys.modules.在同一会话中再次导入同一模块的任何尝试都只返回其中包含的现有模块.当从多个位置导入模块时,这可以加快整体体验.它还允许模块在所有导入之间共享自己的对象,因为每次都返回相同的模块.
如上所述,您可以使用reload重新导入整个模块.检查文档中的警告,因为即使这不是万无一失的.
从模块导入特定项目时,将按上述方式导入整个模块,然后将请求的对象放在命名空间中.reload不起作用,因为这些对象不是模块,并且您从未收到对模块本身的引用.解决方法是获取对模块的引用,重新加载它,然后重新导入:
>>> from foo import baz
>>> print baz
original
>>> # change foo.py from baz = 'original' to baz = 'changed'
>>> import foo
>>> reload(foo)
>>> from foo import baz
>>> print baz
changed
Run Code Online (Sandbox Code Playgroud)