使用importlib来处理来自x import *的情况

时间:2015-07-25 18:22:38

标签: python python-3.x python-importlib

如何使用importlib动态重新加载先前导入的模块:

from my_module import *
import some_module as sm

该文档给出了简单导入的示例,如:

import my_module

作为

importlib.reload('my_module')

版本:Python 3.4

1 个答案:

答案 0 :(得分:1)

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