在大多数情况下,你可以使用Python默认的搜索路径不需要去配置。但是如果你想跨目录的导入自定义的文件,那就需要知道如何定制化了。概括的讲,Python的搜索路径由几大块组成,其中的一些已经预先设置过,而有一些需要你告诉Python哪里去找:
- 程序的根目录
- PYTHONPATH目录(如果设置的话)
- 标准库文件目录
- pth文件的内容(如果有的话)
- 第三方扩展的site-packages
下面是Python如何使用这几个部分的:
根目录(自动)
Python首先在根目录中寻找被导入的文件。如果你运行的是一个程序,那么包含程序顶层文件的目录就是根目录;如果你是在命令行中运行的,那么根目录就是你当前的工作目录。
因为这个目录总是自动搜索的,如果程序在一个单独的文件夹中,它的所有的导入都会自动工作的不需要去配置。另一方面,因为这个目录是首先搜索,所以可能会覆盖在其他目录中的相同名字的模块文件。
PYTHONPATH目录(配置)
Python会搜索所有列在环境变量PYTHONPATH中的目录,从左到右。简单的讲,PYTHONPATH
就是一个用户定义的列表然后系统会确认其中包含Python代码的目录。你可以添加所有的你希望被搜索的目录,Python会拓展所有的模块搜索路径,包含所有在PYTHONPATH中列出的目录。
因为Python会首先搜索根目录,这个设置只有在需要引用的文件跨目录时才比较重要
标准库目录(自动)
接下来Python会自动搜索安装时Python标准库所在的目录,这个目录是自动搜索的,所以不需要配置。
.pth路径文件目录(配置)
接下来,Python中一个比较少用的特性允许用户添加模块搜索路径到一个后缀名为.pth的文本文件中,每个一行。这个路径配置一定程度上是比较高级的特性,不做详解,相对于PYTHONPATH来说这个是可供选择的。
第三方扩展的Lib\site-packages路径(自动)
最终,Python会自动添加site-packages子目录到模块搜索路径,这个位置是大部分第三方扩展安装的地方,用户可以直接使用第三方扩展的模块而不需要路径设置。
配置搜索路径
PYTHONPATH和路径文件都允许添加搜索路径,设置环境变量的方法依系统而不同,例如在Windows中,通过系统面板的控制按钮通过如下格式设置:
c:\pycode\utilities;d:\pycode\package1
或者创建一个路径文件例如C:\Python33\pydirs.pth
,内容格式如下:
c:\pycode\utilities
d:\pycode\package1
sys.path列表
如果你想知道模块搜索路径在机器上事实上是如何配置的,你可以通过打印内置sys.path列表的方法检查路径。这个列表的目录名字符串在Python内部是事实上的搜索路径。import时,Python从左到右搜索列表中的目录,使用第一个搜索到的符合的文件。
sys.path是模块搜索路径。Python在程序启动的时候配置它,自动加入顶层文件的根目录、任何PYTHONPATH目录、创建的.pth文件的内容、所有的标准库目录。综合的目录名列表就是每次引入新文件时Python搜索的路径。
Python展示这个列表有两个原因。首先,这提供了一种方法去检查你设置的搜索路径——如果你没看到你在其他地方设置的目录,你需要重新检查之前的工作,例如:
>>> import sys
>>> sys.path
['', 'C:\\code', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs',
'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Users\\mark',
'C:\\Python33\\lib\\site-packages']
其次,如果你知道在做什么的话,这个列表提供了一个方法通过脚本手动添加搜索路径。通过修改sys.path列表,你可以修改搜索路径以备将来的引用。这样的修改持续的时间只在代码运行期间。然而,PYTHONPATH和.pth文件提供了一种永久修改路径的方法。
另一方面,一些程序确实需要更改sys.path。例如运行在web服务器上的代码,因为这样的代码不能依靠设置PYTHONPATH,通常手动设置sys.path去包含源文件目录。sys.path.append或sys.path.insert足够使用,尽管这样的修改只在程序运行时有效。