Python sys.modules和globals()中的模块名称
如果我导入一个模块,模块名称将同时显示在Python sys.modules和globals()中的模块名称,python,Python,如果我导入一个模块,模块名称将同时显示在sys.modules和globals()中。如果我再次删除它,它将从globals()中删除,但仍驻留在sys.modules中。为什么会这样 import mymodule 'mymodule' in globals() # True 'mymodule' in sys.modules # True del mymodule 'mymodule' in globals() # False 'mymodule' in sys.modules #
sys.modules
和globals()
中。如果我再次删除它,它将从globals()
中删除,但仍驻留在sys.modules
中。为什么会这样
import mymodule
'mymodule' in globals() # True
'mymodule' in sys.modules # True
del mymodule
'mymodule' in globals() # False
'mymodule' in sys.modules # Still True, why?
我还发现了以下区别:
from mypackage import mymodule
'mypackage' in sys.modules # True
'mymodule' in sys.modules # False !
'mypackage.mymodule' in sys.modules # also True !
对于globals()
,答案是互补的:
因为Python缓存模块是为了防止(昂贵、缓慢)的模块查找过程超出需要而运行 如果需要,可以从系统模块中删除模块,但也可以工作
更详细地说,当您导入mymodule时,会发生各种事情。假设
mymodule
不是解释器可执行文件中内置的模块之一:
mymodule
的文件(可能是mymodule.py
,mymodule.pyc
,或者mymodule.pyd
——或者是我没有想到的其他文件。这可以查看当前目录、sys.path和其他位置import
语句中指定的局部变量import
背后的机制,上面是一个非常粗略的近似值。它可能在重要和微妙的方面是错误的。)
请注意,将模块对象绑定到本地名称实际上是实际导入过程的一小部分。通过执行
del mymodule
,删除名称绑定不会影响导入的其余部分。与任何其他Python对象一样,模块会继续存在,直到不再有对它的引用为止r单词,sys.modules
的行为类似于常规的dict,并且
import mymodule
lst = {mymodule.__name__: mymodule}
'mymodule' in globals() # True
'mymodule' in lst # True
del mymodule
'mymodule' in globals() # False
'mymodule' in lst # Still True
sys.modules
仅在导入语句时被查阅。您可以从sys.modules
中删除模块,使Python在下次导入时重新加载该模块。del
删除适当范围内名称的绑定;它与模块本身无关
sys.modules
保留已加载的所有模块的列表,无论它们是否绑定到程序中的任何名称。可以从sys.modules中删除模块,del sys.modules['mymodule']
,这有时很有用。但是如果我通过执行del mymodule
删除名称绑定,我会将其从名称空间中删除,以便执行import mymodule
,这两个步骤一起相当于执行重新加载(mymodule)
,对吗?@Hongbo:错:import
首先在sys.modules
中查看是否已经导入了模块。如果已经导入了,它只会给你上次导入模块时创建的模块对象。因为del mymodule
不会从sys.modules
中删除模块对象,所以重新导入它只需将名称重新绑定到sys.modules
@Hongbo中的对象:如果您希望它重新导入模块,请执行reload(module)
。等效地,将其从sys.modules
中删除,然后导入它。非常感谢,Katriealex。您的回答帮助我解决了帖子中的难题
import mymodule
lst = {mymodule.__name__: mymodule}
'mymodule' in globals() # True
'mymodule' in lst # True
del mymodule
'mymodule' in globals() # False
'mymodule' in lst # Still True