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数据结构之二叉树的建立实例
Apr 29 Python
python中去空格函数的用法
Aug 21 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
不要用强制方法杀掉python线程
Feb 26 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
Python探索之SocketServer详解
Oct 28 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Django 实现jwt认证的示例
Apr 30 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
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
2009/08/04 Javascript
小议javascript 设计模式 推荐
2009/10/28 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
python 模拟登陆163邮箱
2020/12/15 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
linux面试相关问题
2012/08/11 面试题
法学研究生自我鉴定范文
2013/12/04 职场文书
数学系个人求职信范文
2014/01/30 职场文书
受资助学生感谢信
2015/01/21 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
python中的plt.cm.Paired用法说明
2021/05/31 Python
Python时间操作之pytz模块使用详解
2022/06/14 Python