python搜索包的规则

python有各种各样的包,那么python解释器是按照什么样的规则去寻找包的呢?
1. python首先会去寻找内置(built_in)的包
2. 然后按照PYTHONPATH环境变量中指定的路径,按顺序搜索。
3. 再就是按照能被python解释器识别到的.pth文件中指定的路径去搜索。
对于后面两点,可以通过sys.path来一起查看(解释器在启动时会通过site.py创建sys.path),如图:
这里写图片描述
sys.path[0]是当前目录的相对路径(最优先)
sys.path[1]是ipython可执行程序所在的目录
sys.path[2]是PYTHONPATH指定的路径
sys.path[3]是当前目录的绝对路径(如果用-c打印sys.path的话是没有这一项的)
sys.path[10]是ipython解释器所在的环境所决定的,它会去找该环境中的site-packages目录,可能是解释器内置的。
剩下的路径基本上是解释器能找到的.pth文件所指定的路径。通常是sys.path[10]这个site-packages目录下的.pth文件。
PS,其实从图中可以看到,包搜索路径里夹杂着ipython自己的“私货”,如果用python -c “import sys, pprint; pprint.pprint(sys.path)”打印sys.path的话,肯定是没有sys.path[1], [11], [12]这些ipython私货的。至于sys.path[3]这一项,python解释器无论是不是用-c打印sys.path,都是没有的。

参考资料:

  1. http://wecatch.me/blog/2016/05/28/python-module-path-find/