[英]ModuleNotFoundError when using importlib.import_module
[英]import vs __import__( ) vs importlib.import_module( )?
我注意到Flask正在使用Werkzeug __import__
一个模块,我有些困惑。 我去检查了它的文档,发现它似乎在某种程度上为您提供了对模块寻找位置的控制权,但是我不确定确切如何并且我不知道它与importlib.import_module
不同。
在Werkzeug示例中,奇怪的是它只说__import__(import_name)
,所以我看不到它与仅使用import
语句有什么不同,因为它忽略了可选的额外参数。
谁能解释? 我看过以前在SO上问过类似问题的其他人,但他们的措词不是很明确,答案根本没有解决这个问题。
__import__
是用于导入模块的低级挂钩函数; 通过提供要导入的模块名称作为变量,可以动态地导入模块,而import
语句不允许您这样做。
importlib.import_module()
是该钩子的包装*为该功能生成一个不错的API; 它是Python 2的最新添加,并且在Python 3中更加充实。使用__import__
代码__import__
通常这样做是因为它们希望与旧版本的Python 2兼容,例如Python 2.7之前的任何版本。
使用__import__
一个副作用是它返回导入的模块,并且不向名称空间添加任何内容。 如果您不想使用新名称,可以直接导入,而不必删除新名称; 使用import somename
将为您的命名空间添加somename
,但是__import__('somename')
会返回导入的模块,您可以忽略该模块。 因此,Werkzeug在一个位置使用挂钩。
所有其他用途都与动态导入有关。 Werkzeug仍然支持Python 2.6,因此不能使用importlib
。
* importlib
是纯Python实现, import_module()
将使用该实现,而__import__
将使用C优化版本。 这两个版本都调用importlib._bootstrap._find_and_load()
因此差异主要是学术上的。
__import__(import_name)
,所以我看不到与仅使用import语句有什么不同
当模块名称为字符串时, __import__()
和importlib.import_module()都允许您导入模块。 您不能写:
x = 're'
import x
否则您会得到:
File "1.py", line 3, in <module>
import x ImportError: No module named x
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.