从__init__.py文件的相对导入引发错误

时间:2014-04-08 16:16:21

标签: python relative-import

所以我使用同事设置的模板,作为python的新手,我可能会遗漏一些非常明显的东西。

主目录有init文件,它有一个生成错误的主python文件所需的模块。

使用同事:

from . import X

其中X是模块,但是当将此(以及填充的init文件)复制到我自己的目录时,它会生成此错误:

  

ValueError:在非包中尝试相对导入

从谷歌和我这里得知,这是完全正确和合乎逻辑的,所以我想知道,作为一个新手,我错过了什么。

1 个答案:

答案 0 :(得分:10)

您必须了解Python如何处理模块。

当您使用脚本启动解释器时,此脚本将成为主模块,其名称为__main__

使用import时,在搜索路径中搜索其他模块,您也可以使用sys.path访问(和更改)。 sys.path的第一个条目通常为空,代表当前目录。

搜索路径中的目录是包含__init__.py文件的包。

现在,当您在包含__init__.py文件的目录中执行脚本时,此脚本将变为__main__,并且该目录不会被视为包,因为它不在{{1 }}!

例如,请考虑以下目录布局:

root/
    pkg/
        __init__.py
        b.py
        c.py
    a.py

sys.path目录运行python a.py时,您可以导入root/并使用此包中的相对导入(例如pkg/中的from . import cb.py)。

当您从__init__.py目录运行python b.py时,您无法使用相对导入,因为Python无法将pkg识别为包:它不在pkg中。对于Python,sys.path是一个普通目录,无论它是否包含pkg__init__.py的完全限定名称仅为c.py,而非c,因此相对pkg.c无效。