文档章节

Python import中相对路径的问题

Honghe
 Honghe
发布于 2012/12/20 10:27
字数 826
阅读 24343
收藏 4
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
0
关于 python ImportError: No module named 的问题

今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一把,make install 后就 ok 了。 然后又在 cygwin 下安...

大数据之路
2013/02/21
0
8
Python全栈工程师(包、模块 的导入)

ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想 为了信仰                         Python人工智能从入门到精通 $ pip3 install tensorflow :   第三...

巴黎香榭
07/19
0
0
python 脚本的启动模式(python -m以模块方式启动)

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

wonengguwozai
05/28
0
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 主要特性

Java 有下面的一些主要特性。 面向对象 在 Java 中,所有的都是对象。正式因为 Java 基于对象模型,所以 Java 更加容易进行扩展。 Java语言提供类、接口和继承等面向对象的特性,为了简单起见...

honeymose
46分钟前
1
0
【NLP】【五】gensim之Word2Vec

【一】整体流程综述 gensim底层封装了Google的Word2Vec的c接口,借此实现了word2vec。使用gensim接口非常方便,整体流程如下: 1. 数据预处理(分词后的数据) 2. 数据读取 3.模型定义与训练...

muqiusangyang
47分钟前
1
0
Python爬虫之网络请求

urllib库中常用函数的使用 安装 urllib库是安装python时自带的一个库,不需要再另外安装; 使用 #!/usr/bin/python3# -*- coding:utf-8 -*-# @Time : 2018-11-10 21:25# @Author : M...

村雨1943
今天
4
0
Linux学习-1030(定时任务、任务管理、)

10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/478722 2. xin......

wxy丶
今天
3
0
git push origin与git push -u origin master的区别

$ git push origin 上面命令表示,将当前分支推送到origin主机的对应分支。 如果当前分支只有一个追踪分支,那么主机名都可以省略。 $ git push 如果当前分支与多个主机存在追踪关系,那么这...

clin003
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部