如果你import
是一个文件,那么 Python 将执行两个不同的步骤:
- 打开导入的模块文件并执行它,包括
import
模块中的任何语句。
- 使导入的模块在当前模块的命名空间中可用。
请注意,如果您导入模块,foo
那么您将无法访问foo
命名空间中导入的模块 - 您需要直接导入它们(或通过 访问它们foo.module
,但通常您希望在模块中导入它们)。
简而言之,每个想要使用模块的文件都foo
需要导入它,即使同一应用程序中的其他文件也使用它。
如果您来自另一种语言,可能会令人困惑的一件事是,Python 仅实际执行一次给定模块(除非您调用reload()
),即使它已在许多地方导入。这就是为什么我将import
上面的操作拆分为两半——第一个只对每个导入的模块执行一次,但第二个总是发生。
因此,如果您执行import foo
which 本身执行,import bar
则两者都已加载并执行一次foo
。bar
您的模块可以访问foo
,但bar
因为您没有导入它(同样,您可以将其用作foo.bar
,但这通常不是很好的做法)。如果您现在运行,import bar
那么您将bar
在您的模块中可用,但是由于该模块已经被导入,Python 将不会再次加载和执行该模块。
如果您需要更多详细信息,官方 Python 文档中详细记录了模块如何工作的细节。
这是否回答你的问题?
额外细节
通常您不需要在运行时通过扫描目录来加载模块,但在某些情况下这可能很有用(例如实现插件)。如果您只想在已安装的模块的固定列表之间进行选择,您可以做一个标准并通过尝试列表中的下一个来import
捕获并处理它。ImportError
如果在运行时才知道名称时确实需要加载模块,则可以使用importlib。Python 标准库还提供了其他几个用于导入模块的模块,例如imp,它具有通过文件名定位和导入模块的功能。
听起来您已经有了解决方案,但有时了解其他可用的模块很有用(这些模块都是标准库的一部分,因此始终安装)。