不应该';在python27中,默认情况下导入不是绝对的吗?

不应该';在python27中,默认情况下导入不是绝对的吗?,python,import,Python,Import,想象一下目录结构: / a/ __init__.py b.py c.py c.py 所有其他文件(包括\uuuu init\uuuu)均为空 运行测试脚本时(使用python 2.7): 使用空目录中的PYTHONPATH=/(因此当前目录中的PYTHONPATH没有添加任何内容),我可以 其中,根据和语句import始终是绝对的 <module 'c' from '/c.py'> 当我删除/a/c.py文件时

想象一下目录结构:

/ a/ __init__.py b.py c.py c.py 所有其他文件(包括
\uuuu init\uuuu
)均为空

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

使用空目录中的
PYTHONPATH=/
(因此当前目录中的
PYTHONPATH
没有添加任何内容),我可以


其中,根据和语句
import始终是绝对的

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

当我删除
/a/c.py
文件时,输出与预期一样

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

更新:


据了解,这似乎是文档中的一个bug。在python27中,默认情况下导入是而不是绝对的。

如果您只是将
/
添加到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

这样,它总是相对于您的包。

“绝对”并不意味着您认为它是相对的;相反,这意味着将执行“常规”包解析过程:首先,它查找包的目录,然后查找sys.path的所有元素;其中包括PYTHONPATH中的元素


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

您需要在Python 2.7上添加来自未来导入绝对导入的
,或者使用导入lib.import\u模块('c')

它是Python 3上的默认值


Python中有一个错误:。

您的完整Python路径是什么?它是唯一的吗?您可能应该使用名为fwiw的根包,这在Python 3中可以正常工作。@jdi-是的,根是PYTHONPATH中唯一的东西(编辑原始帖子使其更明确),谢谢,但问题更多的是,这是一种正确的行为,而不是如何重新组织代码使其工作。我正在解决的实际问题是,“c”是python内置模块的名称,我正在处理的包中的代码正在跟踪它(根据python文档不应该这样做),这要感谢@Ivo,但声明绝对导入始终是一个可以从sys.path访问的模块或包。首先,包目录中的查找没有任何内容。你能指出一些记录你描述的行为的资源吗?在实现过程中非常清楚:“如果要导入的模块应该包含在包中,那么传递给find_module()的第二个参数(父包上的path)将用作路径源。”“首先,它在包的目录中查找”。不,那是相对重要的。你说得对!在进一步挖掘之后,我找到了指向的链接,确认在python27中默认情况下绝对_导入功能没有打开。
<module 'c' from '/c.py'>
/myPackage
    a/
        __init__.py
        b.py
        c.py
    __init__.py
    c.py
from myPackage import c
from myPackage.c import Foo
import myPackage.c