如果import
一个文件,那么Python会执行两个不同的步骤:
- 打开导入模块文件并执行它,包括在模块中的任何
import
语句。
- 使导入的模块在当前模块的名称空间中可用。
请注意,如果您导入模块foo
,那么你将无法获得通过foo
在命名空间导入模块 - 你需要直接导入(或通过foo.module
访问它们,但通常你会想要将它们导入你的模块中)。
简而言之,即使同一应用程序中的其他文件也使用它,每个要使用模块foo
的文件都需要导入它。
一件事,如果你从另一种语言来可能会造成混淆的是,Python的只有永远居然一下子执行给定模块(除非你调用reload()
),即使它在很多地方的输入型。这就是为什么我将import
的动作分为两部分 - 第一部分只对每个导入的模块执行一次,但第二部分总是发生。
所以,如果你这样做import foo
这本身执行import bar
那么这两个foo
和bar
已经被加载并执行一次。您的模块有权访问foo
,但不能使用bar
,因为您尚未导入它(同样,您可以将其作为foo.bar
使用,但这通常不是很好的做法)。如果您现在运行import bar
,那么您的模块中将有bar
可用,但是由于该模块已被导入,一旦Python将而非加载并再次执行该模块。
如果您需要更多详细信息,有关模块工作方式的详细信息请参见official Python documentation。
这是否回答你的问题?
额外的细节
通常你不需要通过扫描目录加载在运行时模块,但存在这样的情况,可以是有用的(例如实施插件)。如果你只是想安装基于哪些模块的固定列表之间进行选择,你可以做一个标准的import
,赶上ImportError
并试图在列表中的下一个处理。
如果做需要加载的模块,当你不知道名字,直到运行时,您可以使用importlib。 Python标准库还提供several other modules for importing modules,如imp,其具有用于定位和通过文件名导入模块的功能。
这听起来像你已经得到了一个解决方案,但它有时是有用知道的是可还有什么(而这些模块是标准库的一部分,所以总是安装)。
是它呢!谢谢:),一旦计时器已到期将选择。再次感谢! – Killrawr