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实例之wxpython中Frame使用方法
Jun 09 Python
python实现将元祖转换成数组的方法
May 04 Python
详解Python:面向对象编程
Apr 10 Python
python数据挖掘需要学的内容
Jun 23 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
python异步编程 使用yield from过程解析
Sep 25 Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 Python
通过Python把学姐照片做成拼图游戏
Feb 15 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与C#的值类型指向区别的详解
2013/05/21 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
利用json获取字符出现次数的代码
2012/03/22 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
使用angular写一个hello world
2015/01/23 Javascript
jQuery实现tab标签自动切换的方法
2015/02/28 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
Node调用Java的示例代码
2017/09/20 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
详细介绍Python函数中的默认参数
2015/03/30 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python reverse反转部分数组的实例
2018/12/13 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
简历的个人自我评价范文
2014/01/03 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
Java中的继承、多态以及封装
2022/04/11 Java/Android