Python ModuleNotFoundError:没有名为<;的模块;模块>;关于importlib import_模块
我正在尝试创建一个模块钩子,它在导入模块时更正模块名称,下面是一个小原型:Python ModuleNotFoundError:没有名为<;的模块;模块>;关于importlib import_模块,python,module,Python,Module,我正在尝试创建一个模块钩子,它在导入模块时更正模块名称,下面是一个小原型: from sys import meta_path, modules from importlib import import_module class Hook: spellcheck = {"maht": "math", "randon": "random", "ramdom": "random"} def find_module(self, module, _): if mod
from sys import meta_path, modules
from importlib import import_module
class Hook:
spellcheck = {"maht": "math", "randon": "random", "ramdom": "random"}
def find_module(self, module, _):
if module in self.spellcheck:
return self
def load_module(self, module):
modules[module] = import_module(self.spellcheck[module])
return modules[module]
meta_path.clear()
meta_path.append(Hook())
import randon
import maht
错误:
Traceback (most recent call last):
File "/home/yagiz/Desktop/spellchecker.py", line 20, in <module>
import randon
File "/home/yagiz/Desktop/spellchecker.py", line 13, in load_module
modules[module] = import_module(self.spellcheck[module])
File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named 'random'
回溯(最近一次呼叫最后一次):
文件“/home/yagiz/Desktop/spellchecker.py”,第20行,在
进口兰登
文件“/home/yagiz/Desktop/spellchecker.py”,第13行,在加载模块中
modules[module]=导入_模块(self.拼写检查[module])
文件“/usr/lib/python3.6/importlib/_init_uuu.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
ModuleNotFoundError:没有名为“random”的模块
当前的机器,Ubuntu18.04和Python3.6.9,我也尝试了较新版本的python它是关于
meta\u path.clear()
,只需删除它
通过使用clear
功能,您正在从内置模块中清除meta\u路径
,因此即使是内置模块random
也无法加载
编辑:
如注释所述,您可以提供拼写错误的错误消息,而不是接受加载拼写错误的模块。这可以通过将Hook
类更新为:
class Hook:
spellcheck = {"maht": "math", "randon": "random", "ramdom": "random"}
def find_module(self, module, _):
if module in self.spellcheck:
return self
def load_module(self, module):
raise ImportError(f"No module named '{module}'. Did you mean '{self.spellcheck[module]}'?")
现在,如果导入拼写错误的模块之一:
import randon
输出:
ImportError: No module named 'randon'. Did you mean 'random'?
这都是关于
meta\u path.clear()
,只需删除它
通过使用clear
功能,您正在从内置模块中清除meta\u路径
,因此即使是内置模块random
也无法加载
编辑:
如注释所述,您可以提供拼写错误的错误消息,而不是接受加载拼写错误的模块。这可以通过将Hook
类更新为:
class Hook:
spellcheck = {"maht": "math", "randon": "random", "ramdom": "random"}
def find_module(self, module, _):
if module in self.spellcheck:
return self
def load_module(self, module):
raise ImportError(f"No module named '{module}'. Did you mean '{self.spellcheck[module]}'?")
现在,如果导入拼写错误的模块之一:
import randon
输出:
ImportError: No module named 'randon'. Did you mean 'random'?
还有一个bug,
random
无法识别。您已经导入了random
包,但您的脚本仍然引用拼写错误的randon
名称。我不确定正确的解决方案是什么,但这可能不是一个完整的解决方案。是否要导入randon
,然后在以后的脚本中使用random
?怎么会!我认为OP想要意外地导入randon,然后在稍后的脚本调用中调用random.randint(1,2),并且没有错误。至少我是这么想的。如果是这样的话,那么这个剧本还有更多的工作要做。让我理论上同意你所说的,然后让我们思考一下背后的问题。调用拼写错误的模块后再使用正确的名称是不合适的。你的代码现在令人困惑,无法阅读,并且具有误导性。我完全同意你的担忧。我认为在这种情况下,更合适的解决方案是在拼写错误上失败,并在运行时提供建议:没有名为“randon”的模块。你的意思是“随机”吗?
也就是说,可能有一个应用程序(比如repl)认为用户希望自动更正拼写错误并没有什么大不了的。我的评论只是试图解释OP的原始问题。仍然有一个bug,random
无法识别。您已经导入了random
包,但您的脚本仍然引用拼写错误的randon
名称。我不确定正确的解决方案是什么,但这可能不是一个完整的解决方案。是否要导入randon
,然后在以后的脚本中使用random
?怎么会!我认为OP想要意外地导入randon,然后在稍后的脚本调用中调用random.randint(1,2),并且没有错误。至少我是这么想的。如果是这样的话,那么这个剧本还有更多的工作要做。让我理论上同意你所说的,然后让我们思考一下背后的问题。调用拼写错误的模块后再使用正确的名称是不合适的。你的代码现在令人困惑,无法阅读,并且具有误导性。我完全同意你的担忧。我认为在这种情况下,更合适的解决方案是在拼写错误上失败,并在运行时提供建议:没有名为“randon”的模块。你的意思是“随机”吗?
也就是说,可能有一个应用程序(比如repl)认为用户希望自动更正拼写错误并没有什么大不了的。我的评论只是试图解释OP的原始问题。