快速了解Python相对导入


Posted in Python onJanuary 12, 2018

1、绝对导入和相对导入

绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等。

相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别。

例1:有以下目录

app/
    __init__.py
    mod.py
    string.py

mod.py内容:import string

当在app/目录下执行Python mod.py时为绝对导入,当在app上层目录执行python -m app.mod时为相对导入。

2、在python 2.7及之前版本中默认是先“相对”后“绝对”的顺序搜索模块,也就是说先在模块所在同一个包内搜索然后在sys.path中搜索。

在上例中,在app上层目录执行python -m app.mod时,将导入app/string.py(可以在string.py中print或者在mod.py中加入print string.__file__来测试)。

使用以下语句将会只搜索绝对路径:

from __future__ import absolute_import

在mod.py开头加上该语句,在app上层目录执行python -m app.mod时,将导入标准库中的string模块。

在python3.3中默认只搜索绝对路径,要使用相对导入,执行以下语句:

from . import string

注意:开头点号只能用在from语句中,不能用在import语句中。

3、相对导入使用模块的__name__属性来决定模块在包结构中的位置。当__name__属性不包含包信息(i.e. 没有用'.'表示的层次结构,比如'__main__'),则相对导入将模块解析为顶层模块,而不管模块在文件系统中的实际位置。

例2:

app/
    __init__.py
    sub1/
         __init__.py
         mod1.py
     sub2/
         __init__.py
         mod2.py

尝试在mod1.py导入mod2.py,加入from ..sub2 import mod2。

直接在sub1目录下执行python mod1.py或在app目录下执行python sub1/mod1.py将报错:"Attempted relative import in non-package"。

在app目录下执行python -m sub1.mod1也将报错:"Attempted relative import beyond toplevel package"。

正确的做法是:在app上层目录执行python -m app.sub1.mod1,或者不要使用from ..sub2 import mod2而改用其他方式(比如将sub2添加到sys.path)。

例3:

__init__.py
start.py
parent.py
sub/
    __init__.py
    relative.py

start.py中包含import sub.relative,relative.py中包含from .. import parent。

执行python start.py将报错:"Attempted relative import beyond toplevel package"。

解决办法:新建pkg目录,将parent.py、sub目录移到pkg目录中,start.py改为import pkg.sub.relative,其它不变。

总结

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

Python 相关文章推荐
python实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Windows下安装Scrapy
Oct 17 Python
Python装饰器简单用法实例小结
Dec 03 Python
python实现动态创建类的方法分析
Jun 25 Python
Python selenium的基本使用方法分析
Dec 21 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
python 连续不等式语法糖实例
Apr 15 Python
详解scrapy内置中间件的顺序
Sep 28 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 Python
Python实现翻转数组功能示例
Jan 12 #Python
Python实现求数列和的方法示例
Jan 12 #Python
python+matplotlib演示电偶极子实例代码
Jan 12 #Python
Python实现读取及写入csv文件的方法示例
Jan 12 #Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 #Python
使用C++扩展Python的功能详解
Jan 12 #Python
聊聊Python中的pypy
Jan 12 #Python
You might like
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
个人银行贷款担保书
2014/04/01 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
艾滋病宣传标语
2014/06/25 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
先进基层党组织材料
2014/12/25 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
毕业生学校组织意见
2015/06/04 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL