文档章节

Python import中相对路径的问题

Honghe
 Honghe
发布于 2012/12/20 10:27
字数 826
阅读 23733
收藏 4
点赞 0
评论 0
1. 从查到的资料来看,关于import路径的来说,分成3类:
  • absolute import 
import xml
import youpackage.xml
from youpackage import xml
这几种都算绝对路径

  • relative import
import xml
从这个语句上是看不出来import的是标准库的xml,还是你的包里的一个库叫xml。

  • explicit relative import
from . import xml
from .xml import some_thing
from ..xml import some_thing
这些以点开头的import明确的表示了import的是相对路径,从而避免了普通relative import的麻烦。

2. 第二种(relative import)肯定是不推荐的。
  • 在python2.5以前,如果当前包中有一个叫xml的库,局部的这个xml就会shadow标准库的xml(和局部变量感觉类似,我犯过好几次这个错误,调试的时候还一定能反应过来)。
  • 在2.5和2.6,这个行为还是一样的,但是如果有以下这个语句,局部的包将不能覆盖全局的包
from __future__ import absolute_import
  • 在2.7中,absolute_import的行为变成了默认行为,如果需要应用局部的包,那就得用明确的相对引用了。
文档是这么描述的,但通过-m运行和直接运行py的行为还是会不一样,看下面这个例子:
$ python --version
Python 2.6.5

$ cat bar/baz.py 
from __future__ import absolute_import
import xml
print xml.__file__

$ python bar/baz.py 
/home/huanghao/workspace/test/bar/xml.pyc

$ python -m bar.baz
/usr/lib/python2.6/xml/__init__.pyc

看上去很奇怪,通过py运行的时候absolute_import好像根本没有作用,原因在这个blog里有解释

3.所以说relative import麻烦事太多,一定不能用了。但是absolute和explicit relative这两个到底用哪个?
PEP8中提到:
Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that  PEP 328  is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.

PEP8还是建议用absolute,即使PEP328实现了explicit relative。
本来我觉得到此就为止了。 但是今天还是有同事非要用explicit relative import,跟我说因为absolute写起来太长,而且当顶层包重命名时,所有的文件都需要修改。
我搜了半天也没找到有文章提到abs比rel一定要好的理由,除了PEP8提到的两个缺乏说服力的词more portable and more readable。
4.explicit relative import有一个小问题:
Relative imports use a module's __name__ attribute to determine that module's position in the package hierarchy. If the module's name does not contain any package information (e.g. it is set to '__main__') then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always "__main__" , modules intended for use as the main module of a Python application should always use absolute imports.

PEP 338 -- Executing modules as scripts:  http://www.python.org/dev/peps/pep-0338/

虽然PEP338搞定了explicit relative import 在-m执行时的问题,但是搞不定直接文件执行的情况。所以用来做程序入口的模块必须使用绝对引用。
看一下这个例子:
$ python --version
Python 2.6.5

$ cat bar/baz.py 
from . import xml
print xml.__file__

$ python -m bar.baz
bar/xml.pyc

$ python bar/baz.py 
Traceback (most recent call last):
  File "bar/baz.py", line 1, in <module>
    from . import xml
ValueError: Attempted relative import in non-package

本文转载自:http://blog.sina.com.cn/s/blog_5d0adef001017yq8.html

共有 人打赏支持
Honghe

Honghe

粉丝 56
博文 125
码字总数 35178
作品 3
福州
高级程序员
python 相对路径文件的操作

python项目中,如果pyton代码需要访问某个外部文件,该文件位于代码文件的某个相对路径位置,我们可以在代码中使用相对路径来访问该文件。 比如图中的代码结构: sample.py文件中,如果要访问...

xyh421 ⋅ 04/13 ⋅ 0

python 脚本的启动模式(python -m以模块方式启动)

今天再看python的项目时,发现GitHub中给出的python脚本的执行格式是python -m pip install somepackage。于是开始了python模式启动之旅。 其中很多相关借鉴了该博客,同时感谢博主:http://...

wonengguwozai ⋅ 05/28 ⋅ 0

python笔记:第三方库pygame安装

1.pygame支持普遍的2D游戏开发,这次主要记录自己安装pygame的一些步骤。 2.先确定你的python解释器是哪个版本,我的是3.6的版本,等等安装的pygame也要下载相对应的版本 3.先确保你的pytho...

qq_39191687 ⋅ 05/28 ⋅ 0

Python中的相对文件路径的调用

五月两场 | NVIDIA DLI 深度学习入门课程5月19日/5月26日一天密集式学习 快速带你入门 阅读全文 > 正文共624个字,预计阅读时间3分钟。 前言 先让我们来看看一个用到相对文件路径的函数调用的...

leadai ⋅ 05/08 ⋅ 0

python的join函数和os.path.join函数

python的join函数和os.path.join函数: join:连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 os.path.join(): 将多个路径组合后返回 示例: jo...

yangzhimingg ⋅ 06/04 ⋅ 0

Mysql-Python 在 Mac osx下的安装

环境配置这个东西很讨厌,但是还必须得配,没办法。这个环境的配置过程也是很多坑,花了一个下午踩坑,由于重启了几次,所以没有截图来记录了。不过还是可以分享一下遇到问题每一步的分析和解...

doctordc ⋅ 05/14 ⋅ 0

Python的22个编程技巧,简化 if 语句、开启文件分享

小编给大家推荐一个学习氛围超好的地方,python交流企鹅裙:474534951!适合在校大学生,小白,想转行,想通过这个找工作的加入 。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直...

诸葛玥 ⋅ 04/15 ⋅ 0

实战(Chapter2):django实现在线教育平台之数据迁移

上节中我们已经讲解了教育平台项目的需求及数据设计,从本节开始,我们正式编码: 1. 项目创建 在 django搭建虚拟环境-virtualenv 这一篇文章中,我们讲解了mac上如何使用virtualenv的目的及...

fuckCoding ⋅ 2017/12/08 ⋅ 0

numpy等python相关的包安装备忘

主要备忘几个问题 1,怎么同时在一台电脑上使用python2和python3 2,怎么安装numpy,matplotlib,igraph,tensorflow等。 1, 同时安装python2和python3 有些情况下需要同时用到python2和pyt...

robin_Xu_shuai ⋅ 2016/12/27 ⋅ 0

听说图像识别很难,大神十行代码进行Python图像识别

随着深度学习算法的兴起和普及,人工智能领域取得了令人瞩目的进步,特别是在计算机视觉领域。21世纪的第二个十年迅速采用卷积神经网络,发明了最先进的算法,大量训练数据的可用性以及高性能...

雁横 ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

180621-一个简单的时间窗口设计与实现

如何设计一个计数的时间窗口 时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数...

小灰灰Blog ⋅ 40分钟前 ⋅ 0

Android之Dalvik、ART、JIT、AOT

Android之Dalvik、ART、JIT、AOT 本文内容:Dalvik、ART、JIT、AOT之间关系 本文定位:知识记录 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习的同学一些灵感 本文整理于[...

lichuangnk ⋅ 44分钟前 ⋅ 0

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class......

lemonLove ⋅ 44分钟前 ⋅ 0

git 命令简写

简写 命令 g git gst git status gd git diff gdc git diff --cached gdv git diff -w "$@" | view - gl git pull gup git pull --rebase gp git push gc git commit -v gc! git commit -v ......

charley158 ⋅ 52分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 53分钟前 ⋅ 0

Intellij IDEA神器常用技巧四-类和方法注释模板设置

IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模...

Mkeeper ⋅ 56分钟前 ⋅ 0

Jira接入钉钉机器人

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.9Z9czj&treeId=257&articleId=106075&docType=1...

谢思华 ⋅ 58分钟前 ⋅ 0

微信公众号开发

一、开通微信服务号,填写URL,微信将想你发送验证信息。接收并处理微信发来的GET请求 二、处理客户向公众号发送的各种消息: 如文本、图片、乐音、视频、音乐 : 消息分为:1 请求消息(文本...

无敌小学僧 ⋅ 今天 ⋅ 0

广州三本找Java实习经历

前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧。 广州三本大三在读,在广州找实习。大学开始接触编程,一个非常平庸的人。 在学习编程时,跟我类似的人应该会...

Java3y ⋅ 今天 ⋅ 0

php json_encode()不转义中文字符 和 斜杠"/"

php格式化json的函数 json_encode($value,$options) 其中有2个比较常用到的参数 JSON_UNESCAPED_UNICODE (中文不转为unicode ,对应的数字 256) JSON_UNESCAPED_SLASHES (不转义斜杠,对应的...

一只大橘子 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部