Python 3.6+如何实现自动强制导入模块?
如何实现自动导入或强制重载Python模块?
你的思路完全没问题,但问题出在动态模块名的导入方式上——当你用import m时,Python会把m当成字面意义上的模块名,而不是你传入的变量值,所以才会报“no such module named 'm'”的错误。
我们可以借助importlib模块的动态导入能力来解决这个问题,下面是修正后的函数:
def import_force(module_name): import sys import importlib if module_name in sys.modules: # 模块已加载,直接重载已存在的模块对象 module = importlib.reload(sys.modules[module_name]) else: # 首次加载,用import_module处理字符串形式的模块名 module = importlib.import_module(module_name) return module
使用示例
比如你要导入(或重载)math模块,只需要传入字符串形式的模块名:
# 首次调用:加载math模块 math_mod = import_force("math") # 再次调用:强制重载math模块 math_mod = import_force("math")
关键细节说明
- 函数接受字符串类型的模块名(包括子模块,比如
"os.path"),完美解决你之前参数传递的问题; - 重载时直接操作
sys.modules中已存在的模块对象,避免重复查找,效率更高; - 返回的模块对象可以直接用来调用模块内的方法/属性,和普通
import的用法一致。
内容的提问来源于stack exchange,提问作者Bimo
相关产品推荐
相关产品推荐

