在python27中默认情况下输入是否绝对是绝对的?

时间:2012-07-30 17:36:44

标签: python import

想象一下目录结构:

/
    a/
        __init__.py
        b.py
        c.py
    c.py

档案/a/b.py如下:

import c
should_be_absolute = c

所有其他文件(包括__init__)都是空的。

运行测试脚本时(使用python 2.7):

import a.b
print a.b.should_be_absolute

来自空目录的PYTHONPATH=/(因此当前目录中没有任何内容添加到PYTHONPATH)我得

<module 'a.c' from '/a/c.py'>

根据PEP 328import <> is always absolute语句,我希望:

<module 'c' from '/c.py'>

删除/a/c.py文件时,输出符合预期。

我错过了什么?如果这是正确的行为 - 如何从c(而不是b)导入a.c模块?

更新

根据python dev mailing list,它似乎是文档中的错误。默认情况下,python27中的导入不是绝对值。

3 个答案:

答案 0 :(得分:26)

您需要在Python 2.7上添加from __future__ import absolute_import或使用importlib.import_module('c')

这是Python 3的默认设置。

Python中存在一个错误:__future__.py and its documentation claim absolute imports became mandatory in 2.7, but they didn't

答案 1 :(得分:0)

如果您只是将/添加到PYTHONPATH,那么搜索顺序仍然可以在当前目录中查找c。如果你把所有东西放在一个root包下面并且绝对地引用它会好得多:

/myPackage
    a/
        __init__.py
        b.py
        c.py
    __init__.py
    c.py

和PYTHONPATH一样:export PYTHONPATH=/:$PYTHONPATH

所以在你的a.c中,你会这样做:

from myPackage import c
from myPackage.c import Foo
import myPackage.c

这样,它始终与您的包相关。

答案 2 :(得分:-1)

“绝对”并不代表你认为它的那个;相反,它意味着“通常”的包解析过程发生:首先,它在包的目录中查找,然后在sys.path的所有元素中查找;其中包括PYTHONPATH的元素。

如果真的想要,你可以使用imp模块之类的工具,但我建议不要这样做。因为通常,您不必创建与标准Python发行版中的模块名称相同的模块。