python导入忽略本地包

时间:2013-08-21 22:56:44

标签: python python-2.x

请注意,这样做并不是一个好主意。它容易混淆,容易出错,而且通常完全没必要。

但是为了争论,假设你有一个与全局包同名的本地包:

module/
   __init__.py
   os.py
   thisfile.py

thisfile.py内,您可以使用以下方法之一明确指定要导入本地版本的os.py

from . import os
from .os import foo

但实际上,使用python 2.x,本地包解析是默认的。只需一个简单的import os即可加载本地os.py而不是系统包。

那么我如何在thisfile.py内部导入系统级os包而不是本地定义的替代方案呢?

2 个答案:

答案 0 :(得分:6)

此行为是特定于python2的。在python3中,默认情况下导入是绝对的,可以解决这类问题。

在python2.5 + * 中,您可以使用将来的导入来修复此行为:

from __future__ import absolute_import

之后,所有导入都是绝对的,并导入一个与您拥有的顶级模块同名的模块,以使用显式相对导入语法。

有关更多背景信息,请参阅PEP 328


* 编辑:在早期的python版本中,唯一的选择是以首先找到顶级模块的方式修改sys.path - 这实际上是一个糟糕的解决方案。 / p>

答案 1 :(得分:1)

你反过来了。

# Absolute import
import os

# Relative import
from . import os

文档:http://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

在较旧的Python(3.0以下的所有版本)版本中,您必须手动启用它,这里是一个包含所有__future__ features

的列表

对于Python 2.5-2.x:

from __future__ import absolute_import