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的原始问题。