前言
Python项目的路径管理是一个让人头疼的问题。在写python项目的时候,明明 import
了文件A,代码运行时却收到 ModuleNotFoundError
,仔细一看,是引用路径不对,很是气人。又或者,当项目中出现了重名的packages时,发现引用的函数并不是自己想要的,而是其他同名packages中的函数。这些问题归根结底都是Python路径管理的问题。那么今天我们一起来看看Python的路径管理到底是怎么做的,了解原理后,以后自然不会被路径问题所困扰了!
路径索引顺序
如我们在Python专题(二)Python二三事中讲的,Python2和Python3在路径索引的顺序上有些许不同,感兴趣的同学可以参考上篇专题内容。本文仅讲Python3版本的情况。首先,在Python中有内建函数(built-in)、第三方库(site-packages)以及自义库三种可以 import
的模块。然后,在 import
模块时,Python解释器的搜索顺序是先搜索built-in模块,然后搜索 sys.path
这个路径列表中的模块。那么Python的built-in模块又有哪些呢?我们可以在Python中用如下命令查看:
import sys
print(sys.builtin_module_names)
你会看到一长串builtin模块的名字,这些模块名称是 import
动作最先搜索到的。
我们在来看看sys.path中又有哪些东西呢?
sys.path
是一个路径列表,里面保存了解释器可以索引的所有路径。这个路径列表可分为如下部分:
- 当前脚本路径
- PYTHONPATH路径
- 虚拟环境路径
- site-packages路径
一般来说,第三方库会安装在site-packages路径下,当前脚本路径则是一些自定义模块,而PYTHONPATH和虚拟环境路径则是当前系统的环境变量和Python虚拟环境保存的路径。
所以当来了一个 import
命令时,Python解释器的搜索顺序就是: