目录

Python-import搜索的路径顺序

Python import搜索的路径顺序

在程序中导入时,如下顺序

1、Python 标准库模块

2、Python 第三方模块

3、应用程序自定义模块

import的搜索顺序:

首先判断这个module是不是built-in即内建模块,如果是则引入内建模块,如果不是则在一个称为 sys.path 的list中寻找

sys.path在python脚本执行时动态生成,包括以下3个部分:

1、脚本执行的位置,即当前路径

2、环境变量中的PYTHONPATH, 即.bash_profilec.

3、安装python时的依赖位置

Python解释器如何找到模块

sys.path

这个函数输出的是一个列表它就包含了 搜索模块的路径 ,这个列表的 第一个路径就是当前路径 ,所谓 当前路径就是你运行Python程序的当前路径 ,比如你的程序放在/home/zhangsan/test.py, 在运行这个程序的时候,这个程序的sys.path列表的第一个路径就是/home/zhangsan,其余的就是系统默认的路径,如下图:

https://i-blog.csdnimg.cn/blog_migrate/d34074cf21124b1eb19426b9eb26845a.png

Python解释器就是通过这个列表来搜索模块的,如果你引入的模块不在这个列表里那么显然就找不到了,也就有了上面的错误。那如何添加呢?

既然sys.path输出是一个列表,那么我们就可以在列表中添加。看下图:

两个列表是不是不同呢?

https://i-blog.csdnimg.cn/blog_migrate/d515ded0919a590eb1d4fc456451c100.png

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

print sys.path

# 添加

sys.path.insert(1, "/work/apps/mymodules")
print sys.path

这里为什么使用 insert 呢,其实你使用 append 也可以, 使用插入就是为了让它快速找到 。这种是动态添加的, 作用范围仅仅是当前 py 文件 ,如果你的很多 py 文件都引入了其他模块怎么办?一个一个修改太麻烦了。

PYTHONPATH

这是个环境变量,系统默认没有。你需要自己设置。

编辑  vim ~/.bashrc

export PYTHONPATH=$PYTHONPATH:/YOU_MODULE_DIRECTORY

然后执行 source ~/.bashrc 使其生效即可。不过不推荐这种方式,因为它会改变 prefix 和 exec_prefix 的值,默认情况下 prefix 和 exec_prefix 都是/usr/local

.pth 文件

这种方式很简单便于管理,在需要 大量添加外部路径的时候非常推荐,而且是永久生效 。启动 Python 程序时候,解释器就会遍历目录, 遇到 pth 就会读取这个文件中的内容并添加到 sys.path 中 。这里以系统自带的 Python2.7 为例说明

/usr/lib/python2.7/site-packages

https://i-blog.csdnimg.cn/blog_migrate/52993a176512b378042835bbeecb85a3.png

其内容就是路径

https://i-blog.csdnimg.cn/blog_migrate/ccdf530418b132f855adc16023677fbe.png