当import语句只包含文件名时,Python如何查找模块文件?

75

我在许多地方看到Python代码使用import sysimport mymodule导入模块。

如果没有提供目录或路径,解释器如何找到正确的文件?


20
在控制台中输入 help("import") 并享受。 - DSM
1
http://effbot.org/zone/import-confusion.htm - Hoopdady
import语句 - jfs
1
请注意,这里介绍的都是简化模型。导入机制相当复杂,但对于纯Python代码来说很少有影响。自从某个版本以来,导入机制可以进行更彻底的定制(例如,有一个小模块可以使import从Github下载最新版本并安装!),这反过来又使整个故事变得更加复杂。 - user395760
2
@DSM - 太酷了!我知道help()命令可以用于获取模块、类和函数的帮助,但我从未意识到它也可以帮助你查看关键字! - ArtOfWarfare
4个回答

75

http://docs.python.org/3/tutorial/modules.html#the-module-search-path


6.1.2 模块搜索路径
当导入名为 "spam" 的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,则在变量 sys.path 给出的目录列表中搜索名为 "spam.py" 的文件。sys.path 是从以下位置初始化的:
- 包含输入脚本的目录(或者没有指定文件时的当前目录)。 - PYTHONPATH(一个目录名称列表,与 shell 变量 PATH 具有相同的语法)。 - 安装相关的默认目录。
注意:在支持符号链接的文件系统上,计算包含输入脚本的目录时会跟随符号链接。换句话说,不会将包含符号链接的目录添加到模块搜索路径中。
初始化后,Python 程序可以修改 sys.path。正在运行的脚本所在的目录被放置在搜索路径的开头,位于标准库路径之前。这意味着该目录中的脚本将被加载,而不是库目录中同名的模块。除非打算进行替换,否则这是错误的。有关更多信息,请参阅标准模块部分。

有关“安装特定默认值”的信息,请参阅site模块的文档。


site 模块就是我一直在寻找的机器人。我一直想知道特定的 Python 实例是如何“知道”事物应该在哪里(除了 CWD 文件和你附加到 sys.path 的文件之外)。我喜欢揭开这类事情的面纱。谢谢! - John Carrell
我尝试使用GitHub actions缓存一些先决条件,虽然这个答案是正确的,但我对要在PYTHONPATH变量中设置什么有些困惑。在我的情况下,我将模块安装到/tmp/opt(用于缓存目的),必须将PYTHONPATH设置为/tmp/opt/lib/python3.6/site-packages才能使事情正常工作。 - Steven W. Klassen
1
实际的导入系统比本教程部分所示的要复杂得多。答案忽略了 sys.meta_path,在 Python 中它是完全可定制的,而这个 PathFinder 行为通常是最后一个阶段(默认情况下它是元路径的最后一个元素)。 - wim

28
此外,您可以使用sys模块查看当前路径。
import sys
print(sys.path)

9
它使用环境变量 PYTHONPATH 来查找包(包含__init__.py文件的文件夹)和模块(或者,如果已经加载过一次,从sys.modules中检索模块对象)。

谢谢!顺便问一下,使用绝对路径或相对路径原则上是允许的吗?我会在10分钟内接受。 - Asciiom
你可以使用任何一种,但通常绝对路径更受欢迎,因为它能提高代码的清晰度。 - Silas Ray
1
并不完全正确。PYTHONPATH只是扩充了sys.path,在大多数正常情况下(从site-packages目录导入的模块),该环境变量甚至不需要存在。 - wim

1
Python有一个路径变量,就像您在终端中拥有的那样。Python在该路径内查找模块,或者在程序所在的文件夹中查找模块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接