Python模块搜索路径代码详解


Posted in Python onJanuary 29, 2018

简述

由于某些原因,在使用 import 时,Python 找不到相应的模块。这时,解释器就会发牢骚 - ImportError。

那么,Python 如何知道在哪里搜索模块的路径呢?

模块搜索路径

当导入名为 hello 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,将在变量 sys.path 给出的目录列表中搜索名为 hello.py 的文件。

sys.path 从这些位置初始化:

包含输入脚本的目录(或当前目录,当没有指定文件时)
PYTHONPATH(目录名列表,与 shell 变量 PATH 语法相同)
与安装相关的默认值

>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', '/usr/local/lib/python3.5', '/usr/local/lib/python3.5/plat-linux',
 '/usr/local/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/site-packages']

注意: '' 表示当前目录(当前脚本所在的路径)

例如,在 /home/wang/workspace 中创建一个名为 hello.py 的模块,内容如下:

print('Hello')

然后,试图加载该模块:

>>> import os
>>> 
>>> os.getcwd() # 获取当前目录
'/home/wang'
>>> 
>>> import hello.py
...
ImportError: No module named 'hello'

很遗憾,由于 sys.path 中没有包含 /home/wang/workspace 这个路径,所以找不到 hello 模块,从而引发 ImportError。

添加模块搜索路径

为了解决上述问题,需要添加模块搜索路径,可以使用以下几种方式:

1.动态增加路径

临时生效,对于不经常使用的模块,这通常是最好的方式,因为不必用所有次要模块的路径来污染 PYTHONPATH。

2.修改 PYTHONPATH 变量

永久生效,对于在许多程序中都使用的模块,可以采用这种方式。这将改变所有 Python 应用的搜索路径,因为启动 Python 时,它会读取这个变量,甚至不同版本的 Python 都会受影响。

3.增加 .pth 文件

永久生效,这是最简单的、也是推荐的方式。Python 在遍历已知的库文件目录过程中,如果遇到 .pth 文件,便会将其中的路径加入到 sys.path 中,于是 .pth 中所指定的路径就可以被 Python 运行环境找到了。

动态增加路径

通过 sys 模块的 append() 方法在 Python 环境中增加搜索路径:

>>> import sys
>>> sys.path.append('/home/wang/workspace')

现在,查看搜索路径:

>>> sys.path
['', '/usr/local/lib/python35.zip', '/usr/local/lib/python3.5', '/usr/local/lib/python3.5/plat-linux',
 '/usr/local/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/site-packages', '/home/wang/workspace']
>>> 
>>> import hello
Hello

可以看到,路径被成功添加进去了,再次执行导入可以正常使用。

修改 PYTHONPATH 变量

打开并编辑 bashrc:

$ vim ~/.bashrc

将以下内容附加到文件末尾:

export PYTHONPATH=$PYTHONPATH:/home/wang/workspace

不要忘记重新加载 shell,方法是退出并重新启动,或者在命令行重新加载配置文件:

$ source ~/.bashrc # 或者 . ~/.bashrc

增加 .pth 文件

在 /usr/local/lib/python3.5/site-packages 下添加一个扩展名为 .pth 的配置文件(例如:extras.pth),内容为要添加的路径:

/home/wang/workspace

总结

以上就是本文关于Python模块搜索路径代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python中常用的各种数据库操作模块和连接实例
May 29 Python
python opencv 直方图反向投影的方法
Feb 24 Python
django 通过URL访问上传的文件方法
Jul 28 Python
Python程序暂停的正常处理方法
Nov 07 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
python判断正负数方式
Jun 03 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
python中二分查找法的实现方法
Dec 06 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 Python
python实现简单石头剪刀布游戏
Oct 24 Python
python机器人行走步数问题的解决
Jan 29 #Python
python的socket编程入门
Jan 29 #Python
Python 错误和异常代码详解
Jan 29 #Python
python实现机器人行走效果
Jan 29 #Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 #Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 #Python
详解Python自建logging模块
Jan 29 #Python
You might like
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
javascript与css3动画结合使用小结
2015/03/11 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
python绘制散点图并标记序号的方法
2018/12/11 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
行政助理的职责
2013/11/14 职场文书
金属材料工程个人求职的自我评价
2013/12/04 职场文书
绿色小区申报材料
2014/08/22 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL