快速了解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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
Python中的with...as用法介绍
May 28 Python
Python 安装setuptools和pip工具操作方法(必看)
May 22 Python
python实现数据导出到excel的示例--普通格式
May 03 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
python动态文本进度条的实例代码
Jan 22 Python
python程序文件扩展名知识点详解
Feb 27 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
利用python爬取有道词典的方法
Dec 08 Python
Django中template for如何使用方法
Jan 31 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
PHP实时显示输出
2008/10/02 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
PHP 第三节 变量介绍
2012/04/28 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
动态为事件添加js代码示例
2009/02/15 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
wxpython 学习笔记 第一天
2009/03/16 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
小区门卫工作职责
2013/12/14 职场文书
亲子活动总结
2014/04/26 职场文书
另类冲刺标语
2014/06/24 职场文书
2014年应急工作总结
2014/12/11 职场文书
教代会闭幕词
2015/01/28 职场文书