Python 导入vs导入vs导入()vs导入lib.import\u模块()?

Python 导入vs导入vs导入()vs导入lib.import\u模块()?,python,python-import,Python,Python Import,我注意到Flask使用Werkzeug导入模块,我有点困惑。我去查看了上面的文档,看到它似乎在某种程度上给了您更多的控制权,让您知道它在何处查找模块,但我不确定具体是如何找到的,我也不知道它与importlib.import\u module有什么不同 Werkzeug示例中的奇怪之处在于,它只是说\uuuuu import\uuuuu(import\u name),因此我看不出这与仅使用import语句有什么不同,因为它忽略了可选的额外参数 有人能解释一下吗?我以前看过其他人问过类似的问题,但

我注意到Flask使用Werkzeug导入模块,我有点困惑。我去查看了上面的文档,看到它似乎在某种程度上给了您更多的控制权,让您知道它在何处查找模块,但我不确定具体是如何找到的,我也不知道它与
importlib.import\u module
有什么不同

Werkzeug示例中的奇怪之处在于,它只是说
\uuuuu import\uuuuu(import\u name)
,因此我看不出这与仅使用
import
语句有什么不同,因为它忽略了可选的额外参数

有人能解释一下吗?我以前看过其他人问过类似的问题,但他们的问题措辞不太清楚,答案根本没有解决这个问题。

是一个用于导入模块的低级钩子函数;它可以通过将要导入的模块名作为变量来动态导入模块,这是
import
语句不允许的

是一个围绕该钩子的包装器*为该功能生成一个漂亮的API;它是Python2的最新添加,在Python3中更加充实。使用
\uuuuu import\uuuu
的代码库通常这样做,因为它们希望与较旧的Python2版本保持兼容,例如Python2.7之前的任何版本

使用
\uuuuu import\uuuu
的一个副作用是它返回导入的模块,并且不向名称空间添加任何内容;如果不需要新名称,则无需删除新名称即可导入;使用
import-somename
somename
添加到您的命名空间中,但是
\uuuuuu-import\uuuuuu('somename')
会返回导入的模块,您可以忽略该模块。Werkzeug在一个位置使用挂钩

所有其他用途都与动态导入有关。Werkzeug仍然支持Python 2.6,因此无法使用
importlib


*
importlib
是一个纯Python实现,而
import\u module()
将使用该实现,而
\uuuuuuuuuuuuuu
将使用C优化版本。这两个版本都调用了importlib.\u bootstrap.\u find\u和\u load(),因此差异主要是学术性的

\uuuu导入(导入名称)
,所以我看不出这与 只是使用import语句

\uuuu import\uuu()
和importlib.import\u module()都允许您在将模块名称作为字符串时导入模块。你不能写:

x = 're'
import x
否则你会得到:

 File "1.py", line 3, in <module>
 import x ImportError: No module named x
文件“1.py”,第3行,在
导入x导入错误:没有名为x的模块

使用
\uuuuu导入
其中
要导入的模块名称仅在运行时已知
。除此之外。。。正如你所说,与导入相比,这赋予了你更大的能力。如果内存正常,则有一段David Beasely关于导入的视频,在视频中,他提到WerkZeug出于某种原因重载了导入。我不太理解你所说的“如果你不想要新名称,你可以使用它导入而不必删除新名称”是什么意思如果你有一分钟的时间,你能像和一个蹒跚学步的孩子说话一样把这件事说出来吗?@Aerovistae:更新了一点
import sys
将名称
sys
添加到您的命名空间(绑定到模块),
sys
模块对象返回给调用者,调用者可以随意忽略该对象。@MartijnPieters By namespace,您是指
sys.modules
?@Neowan:命名空间指模块的全局。它们以字典的形式存储在
模块
实例中,而该实例又存储在
sys.modules
@Mahesha999中:要从存储在字符串中的源代码动态生成模块,您根本不需要查看
\uu导入
。使用规范(importlib.machine.ModuleSpec(module\u name,None,origin='')中的
module=importlib.util.module\u创建一个空模块实例
,使用
sys.modules[module\u name]=module
存储模块,然后使用
exec(sourcecode,module.\uu dict\uu)执行源代码。而且永远不要执行用户提供的代码,这是非常不安全的。