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 14 Python
Python max内置函数详细介绍
Nov 17 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
python tkinter图形界面代码统计工具
Sep 18 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
Django之form组件自动校验数据实现
Jan 14 Python
python对接ihuyi实现短信验证码发送
May 10 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
如何基于python把文字图片写入word文档
Jul 31 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 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+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
PHP 日期加减的类,很不错
2009/10/10 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php实现倒计时效果
2015/12/19 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
js停止输出代码
2008/07/20 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
python黑魔法之编码转换
2016/01/25 Python
Python优先队列实现方法示例
2017/09/21 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Django中的文件的上传的几种方式
2018/07/23 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
个人收入证明范本
2014/09/18 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
销售合作意向书范本
2015/05/08 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android