以故障安全方式使用__import __()重新导入相同的python模块

时间:2012-08-15 08:50:35

标签: python

我正在使用__import__导入python模块。但是我想实现一个解决方案来重新导入一个可能同时改变的模块(开发/调试目的)。如果我试试这个,我仍然会得到“旧”模块,我想因为它已经被导入了。我可以以某种方式强制python从相同的.py文件名重新导入模块的新版本吗?在重新导入之前,我无法删除旧模块(这会有所帮助),因为我想要某种防错行为:如果(重新)导入失败,我想继续使用旧模块。

像这样或多或少的伪代码:

mod = None
reload_trigger = True
MODULE_NAME = "mymodule.py"
while True:
    if reload_trigger:
        reload_trigger = False
        try:
            mod_new = __import__(MODULE_NAME)
        except ImportError as a:
            if mod is None:
                raise RuntimeError("Initial module import failed, cannot continue!")
            print("Import problem, still using the old module: " + str(a))
            continue
        mod = mod_new
        del mod_new
     mod.main_loop_iterate_etc()  # it may also set reload_trigger to True

Afaik reload()可用于重新导入模块,但我不知道如果重新导入失败如何处理这种情况,所以我仍然可以使用旧模块。用异常处理程序“保护”reload()以捕获导入问题等是否足够?

另外,我应该手动处理情况重新加载我重新导入的模块导入的所有模块吗?因为我希望它们被重新加载以及“依赖”。

谢谢!

1 个答案:

答案 0 :(得分:1)

重新导入模块的正确方法是使用reload,但是你想要防止重新导入失败是正确的。我建议从IPython自动加载扩展(source)查看superreload

这应该处理重新加载中的错误:

old_dict = module.__dict__.copy()
try:
    module = reload(module)
except:
    module.__dict__.update(old_dict)
    raise