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 25 Python
K-近邻算法的python实现代码分享
Dec 09 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
python读取文件名并改名字的实例
Jan 07 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
python内置函数sorted()用法深入分析
Oct 08 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python中内建模块collections如何使用
May 27 Python
python一些性能分析的技巧
Aug 30 Python
如何将json数据转换为python数据
Sep 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应用程序的七个习惯深入分析
2013/06/08 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
Python全排列操作实例分析
2018/07/24 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
中间件分为哪几类
2016/09/18 面试题
一道Delphi上机题
2012/06/04 面试题
4s客服专员岗位职责
2013/12/01 职场文书
青春无悔演讲稿
2014/05/08 职场文书
先进单位申报材料
2014/12/25 职场文书
销售内勤岗位职责
2015/02/10 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS