【问题标题】:Re-import the same python module with __import__() in a fail-safe way使用 __import__() 以故障安全的方式重新导入相同的 python 模块
【发布时间】:2012-08-15 08:50:35
【问题描述】:

我正在使用__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() 以捕获导入问题等是否足够?

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

谢谢!

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

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

    【讨论】:

    • 您真的要更新而不是分配吗?如果模块包含新的导入,并且其中一些成功了,从技术上讲,您不会恢复到旧状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2014-04-03
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多