我有一个名为myfile.py
//myfile.py
msg = 'Hello World'
然后我导入它:import myfile
然后我做了一些修改,例如:
//myfile.py (updated)
a = 'Some text'
b = 'Some other text'
然后我调用重载函数:
from imp import reload
reload(myfile)
现在我跑的时候:dir(myfile)
它显示当前模块重新加载的名称以及之前的(所有其他先前的导入/重新加载)
当导入/重新加载模块时,这是否意味着“所有”名称(更新后省略的名称)可以单独用于外部世界吗?
答案 0 :(得分:1)
重新加载模块时,保留其字典(包含模块的全局变量)。名称的重新定义将覆盖旧的定义,因此这通常不是问题。如果新版本的模块未定义旧版本定义的名称,则旧定义仍为。
重新加载前不擦除模块。该模块的新代码在所有旧的变量绑定仍然存在的情况下执行。新代码定义的任何名称都会替换旧的绑定,但新版本未定义的任何内容都会保留其旧值。 This also applies in Python 2
答案 1 :(得分:0)
使用可以使用Python的内置函数reload。来自文档:
执行重装(模块)时:
- 重新编译Python模块的代码并重新执行模块级代码,定义一组绑定到名称的新对象
在模块的字典中。扩展模块的init功能是 第二次不叫。- 与Python中的所有其他对象一样,只有在引用计数降为零后才会回收旧对象。
- 模块名称空间中的名称将更新为指向任何新对象或已更改的对象。
- 对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,必须是 如果需要,在每个命名空间中更新它们。
以下是一个例子:
首先,我们创建一个定义变量msg
的文件和一个打印它的方法。
// myfile.py
msg = 'Hello World'
def x():
print msg
// run from the shell
shell1$ python
>>> import myfile
>>> myfile.x()
Hello World
现在我们修改文件,删除变量msg
并添加a
和b
变量(不退出当前的Python REPL)。
// myfile.py - updated
a = 'Some text'
b = 'Some other text'
def x():
print '%s: %s' % (a, b)
// run from the same python session
>>> reload(myfile)
<module 'myfile' from 'myfile.pyc'>
>>> myfile.x()
Some text: Some other text
如果您使用外部编辑器编辑了模块源文件并希望在不离开Python解释器的情况下试用新版本,这将非常有用。
最后一点:reload(myfile)
仅重新加载指定的模块。必须单独重新加载模块的(myfile)导入。此外,任何引用模块中任何内容的对象(如模块中定义类的实例)将继续使用先前加载的值。