我注意到Flask正在使用Werkzeug来__import__
一个模块,我有点困惑。我去检查了它上面的文档,看到它似乎在某种程度上给了你更多的控制权来看它模块的位置,但是我不确定完全我是怎么做的零想法它与importlib.import_module
的区别。
Werkzeug示例中的奇怪之处在于它只是说__import__(import_name)
,所以我不知道这与使用import
语句有什么不同,因为它& #39; s忽略可选的额外参数。
有人可以解释一下吗?我看过其他人之前曾就此问过类似的问题,但他们并没有非常明确地提出问题,答案根本没有解决这个问题。
答案 0 :(得分:45)
__import__
是一个用于导入模块的低级钩子函数;它可以用来导入模块动态,方法是将模块名称作为变量导入,import
语句不允许你这样做。
importlib.import_module()
是钩子 * 的包装器,为函数生成一个很好的API;它是Python 2的最新成员,并且在Python 3中更加充实。使用__import__
的代码库通常会这样做,因为它们希望与较旧的Python 2版本保持兼容,例如Python 2.7之前的任何内容。
使用__import__
的一个副作用可能是它返回导入的模块并且不向命名空间添加任何内容;您可以使用它导入,而不必删除新名称,如果您不想要新名称;使用import somename
会将somename
添加到您的命名空间,但__import__('somename')
会返回导入的模块,然后您可以忽略该模块。由于这个原因,Werkzeug在一个地方使用了钩子。
所有其他用途都与动态导入有关。 Werkzeug仍支持Python 2.6,因此无法使用importlib
。
* importlib
是Pure-Python实现,import_module()
将使用该实现,whist __import__
将使用C优化版本。两个版本都回拨给importlib._bootstrap._find_and_load()
,因此差异主要是学术性的。
答案 1 :(得分:4)
__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