sys.path 之外还有其他搜索路径吗?
我原以为,sys.path 是一个包含了 Python 模块所有搜索路径的完整列表。
但是,在我的 Ubuntu 电脑上,几乎所有的模块都在 '/usr/local/lib/python2.6/dist-packages/' 这个路径下,而这个路径并不在 sys.path 里。不过我仍然可以从这个路径导入任何模块。
补充说明,这个说法不对:即使我把 sys.path 设置为空列表,我仍然可以从那个路径导入模块。
那么,这个 dist-packages 路径的隐含知识是从哪里来的呢?还有没有其他类似的隐含搜索路径?
补充说明:看来我帖子后面的部分不对。实际上,“sys.path = []” 的确意味着我无法导入任何东西,连当前工作目录的内容也不能导入。抱歉。
2 个回答
其实,模块是根据一个叫做 sys.path 的变量来查找的。这个变量里面列出了几个目录,通常是包含你正在运行的脚本的目录(或者是当前目录),还有 PYTHONPATH 和一些跟安装有关的默认路径。
你遇到的问题跟这个安装相关的默认路径有关系。
注意这里提到的一个依赖于安装的默认值,可以在以下链接中找到:
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-packages
在 sys.path
中是存在的。如果我清空 sys.path
,然后尝试从上面的目录导入一个模块,这就不再有效了。这表明解释器对这个目录没有隐式的了解,而是通过 sys.path
找到它。
编辑 当你进行实验时,确保在 Python 会话开始时就修改 sys.path
。如果你先 import X
,然后清空 sys.path
,再 import X
一次,后者不会失败,即使 X
已经不在 sys.path
中。