详解Python中的from..import绝对导入语句


Posted in Python onJune 21, 2016

相对或者绝对import
更多的复杂部分已经从python2.5以来实现:导入一个模块可以指定使用绝对或者包相对的导入。这个计划将移动到使绝对的导入成为默认的细节在其他版本的python中。
我们假设你有一个包目录,像下面这样:

pkg/
pkg/__init__.py
pkg/main.py
pkg/string.py

上面定义了一个包称为 pkg 包含 pkg.main 和pkg.string 两个子模块。考虑在‘main.py'中的代码,什么事情会发生如果我们执行语句 import string 在python2.4或者更早的版本?他将会查询包的目录执行一个相对的import,找到pkg/string.py ,导入文件的内容作为pkg.string模块,这个模块的边界的名字是'string'在pkg.main模块中的名称空间。
如果pkg.string是你想要的这个非常不错。但是如果你仅仅想要的是python的基本的string模块?
没有清楚的方法忽略pkg.string以及寻找基本的模块;一般情况下你不得不去查看sys.modules中的内容,那有一点稍微的不清楚。Holger Krekel的py.std包提供了一个整齐的方法执行从基本库中导入的方法,improt py;py.std.string.jion(),但是那个包在python的安装过程是是不可用的。

阅读代码在相对导入方面也是不够清晰的,因为读者可能混淆string和pkg.string模块使用。Python用户可以马上知道那是不同的名称在基本库和自己的包模块之间,但是你不能保护你自己的子模块名字在一个新版本的python中。

从python2.5,你可以打开 import的行为直接去绝对导入使用一个 from __future__ import absolute_import 。这个绝对导入行为将成为一个默认的细节在将来的python中。一旦绝对导入被默认,import string 将总是寻找基本库。建议用户尽可能多的使用绝对导入,因此在你的代码中使用from pkg improt string是适宜的。在python2.*版本中需要:

from __future__ import absolute_import

示例1:
例如:在模块A.B.C中的代码:

from . import D     # 导入A.B.D
from .. import E    # 导入A.E
from ..F import G    # 导入A.F.G,.. 和 F是连着的,中间没有空格

.代表当前目录,..代表上一层目录,...代表上上层目录。

示例2:

目录结构:

package/
 __init__.py
 subpackage1/
  __init__.py
  moduleX.py
  moduleY.py
 subpackage2/
  __init__.py
  moduleZ.py
 moduleA.py

在subpackage1/moduleX.py 或者 subpackage1/__init__.py中可以这样导入module:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

注意,from ...sys import path是合法的,但是不建议。直接from sys import path就行了。

Python 相关文章推荐
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
python邮件发送smtplib使用详解
Jun 16 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
Python中拆分字符串的操作方法
Jul 23 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
Python argparse模块使用方法解析
Feb 20 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 #Python
深入解析Python中的__builtins__内建对象
Jun 21 #Python
浅谈Python中函数的参数传递
Jun 21 #Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 #Python
常见python正则用法的简单实例
Jun 21 #Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 #Python
简单讲解Python编程中namedtuple类的用法
Jun 21 #Python
You might like
PHP写的求多项式导数的函数代码
2012/07/04 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
新闻内页-JS分页
2006/06/07 Javascript
任意位置显示html菜单
2007/02/01 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
python如何在循环引用中管理内存
2018/03/20 Python
Python装饰器简单用法实例小结
2018/12/03 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
导游的职业规划书范文
2013/12/27 职场文书
化妆品促销方案
2014/02/24 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
音乐学专业求职信
2014/07/22 职场文书
村安全生产责任书
2014/08/25 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2014年市场部工作总结
2014/11/25 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python