17

想象一下目录结构:

/
    一种/
        __init__.py
        b.py
        py
    py

文件/a/b.py看起来像:

进口c
应该_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模块?ba.c

更新:

根据python dev 邮件列表,它似乎是文档中的一个错误。默认情况下,python27 中的导入不是绝对的。

4

3 回答 3

27

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

它是 Python 3 的默认设置。

Python 中有一个错误:__future__.py它的文档声称绝对导入在 2.7 中成为强制性的,但他们没有.

于 2012-07-31T13:58:38.973 回答
0

如果您只是添加/到 PYTHONPATH,那么搜索顺序可能仍在c当前目录中查找。如果您将所有内容都放在根包下并绝对引用它会更好:

/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

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

于 2012-07-30T17:52:40.290 回答
-1

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

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

于 2012-07-31T10:08:02.137 回答