sys.path 之外还有其他搜索路径吗?

5 投票
2 回答
2964 浏览
提问于 2025-04-16 21:32

我原以为,sys.path 是一个包含了 Python 模块所有搜索路径的完整列表。

但是,在我的 Ubuntu 电脑上,几乎所有的模块都在 '/usr/local/lib/python2.6/dist-packages/' 这个路径下,而这个路径并不在 sys.path 里。不过我仍然可以从这个路径导入任何模块。

补充说明,这个说法不对:即使我把 sys.path 设置为空列表,我仍然可以从那个路径导入模块。

那么,这个 dist-packages 路径的隐含知识是从哪里来的呢?还有没有其他类似的隐含搜索路径?

补充说明:看来我帖子后面的部分不对。实际上,“sys.path = []” 的确意味着我无法导入任何东西,连当前工作目录的内容也不能导入。抱歉。

2 个回答

1

模块搜索路径

其实,模块是根据一个叫做 sys.path 的变量来查找的。这个变量里面列出了几个目录,通常是包含你正在运行的脚本的目录(或者是当前目录),还有 PYTHONPATH 和一些跟安装有关的默认路径。

你遇到的问题跟这个安装相关的默认路径有关系。

关于安装相关搜索路径的更多信息

4

注意这里提到的一个依赖于安装的默认值,可以在以下链接中找到:

6.1.2. 模块搜索路径

当我们导入一个叫做 spam 的模块时,解释器会先在包含输入脚本的文件夹里寻找一个名为 spam.py 的文件,然后再去查找环境变量 PYTHONPATH 指定的文件夹列表。这个 PYTHONPATH 的格式和 shell 里的 PATH 变量一样,都是一系列文件夹的名称。如果 PYTHONPATH 没有设置,或者在这些地方找不到文件,搜索就会继续在一个依赖于安装的默认路径中进行;在 Unix 系统上,这个默认路径通常是 .:/usr/local/lib/python

实际上,模块的搜索是在 sys.path 这个变量指定的文件夹列表中进行的。这个列表是从包含输入脚本的文件夹(或者当前文件夹)、PYTHONPATH依赖于安装的默认路径初始化的。这让那些知道自己在做什么的 Python 程序可以修改或替换模块的搜索路径。需要注意的是,因为运行的脚本所在的文件夹在搜索路径中,所以脚本的名字不能和标准模块重名,否则 Python 会试图将这个脚本当作模块来加载,这通常会出错。更多信息请查看标准模块部分。

编辑 在我的 Ubuntu 系统上,/usr/local/lib/python2.6/dist-packagessys.path 中是存在的。如果我清空 sys.path,然后尝试从上面的目录导入一个模块,这就不再有效了。这表明解释器对这个目录没有隐式的了解,而是通过 sys.path 找到它。

编辑 当你进行实验时,确保在 Python 会话开始时就修改 sys.path。如果你先 import X,然后清空 sys.path,再 import X 一次,后者不会失败,即使 X 已经不在 sys.path 中。

撰写回答