对于 from x import * 这样的情况使用 importlib
Using importlib for cases like from x import *
如何使用 importlib
动态重新加载之前导入的模块:
from my_module import *
import some_module as sm
文档给出了普通导入的示例,例如:
import my_module
作为
importlib.reload('my_module')
版本:Python3.4
from my_module import *
创建对 my_module
中不以下划线开头的所有名称的引用,或者,如果存在,对 my_module.__all__
序列中的所有名称的引用。
您必须在 importlib.reload()
调用后重新创建相同的重新绑定:
def reload_imported_names(module_name, globals, *names):
"""Reload module and rebind imported names.
If no names are given, rebind all names exported by the module
"""
importlib.reload(module_name)
module = sys.modules[module_name]
if not names:
names = getattr(module, '__all__',
(n for n in dir(module) if n[0] != '_'))
for name in names:
globals[name] = getattr(module, name)
其中 globals
应该是对您使用 from module_name import *
的模块的全局变量的引用。在该模块本身中,您可以使用 globals()
函数来访问该词典。
该函数同时支持 from my_module import *
和 from my_module import foo, bar
两种情况:
reload_imported_names('my_module', globals()) # import *
reload_imported_names('my_module', globals(), 'foo', 'bar') # import foo, bar
如何使用 importlib
动态重新加载之前导入的模块:
from my_module import *
import some_module as sm
文档给出了普通导入的示例,例如:
import my_module
作为
importlib.reload('my_module')
版本:Python3.4
from my_module import *
创建对 my_module
中不以下划线开头的所有名称的引用,或者,如果存在,对 my_module.__all__
序列中的所有名称的引用。
您必须在 importlib.reload()
调用后重新创建相同的重新绑定:
def reload_imported_names(module_name, globals, *names):
"""Reload module and rebind imported names.
If no names are given, rebind all names exported by the module
"""
importlib.reload(module_name)
module = sys.modules[module_name]
if not names:
names = getattr(module, '__all__',
(n for n in dir(module) if n[0] != '_'))
for name in names:
globals[name] = getattr(module, name)
其中 globals
应该是对您使用 from module_name import *
的模块的全局变量的引用。在该模块本身中,您可以使用 globals()
函数来访问该词典。
该函数同时支持 from my_module import *
和 from my_module import foo, bar
两种情况:
reload_imported_names('my_module', globals()) # import *
reload_imported_names('my_module', globals(), 'foo', 'bar') # import foo, bar