繁体   English   中英

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

[英]relative import from __init__.py file throws error

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

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

同事使用:

from . import X

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

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

从谷歌和SO我收集到这是完美的和合乎逻辑的所以我想知道,作为一个新手,我错过了什么。

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

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

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

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

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

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

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

root/目录运行python a.py ,可以导入pkg/并在此包中使用相对导入(例如, from . import c b.py__init__.py中的b.py from . import c )。

当您从pkg目录运行python b.py ,您无法使用相对导入,因为Python无法将pkg识别为包:它不在sys.path 对于Python, pkg是一个普通的目录,无论它是否包含__init__.py c.py的完全限定名称只是c ,而不是pkg.c ,因此是一个亲戚from . import c from . import c将无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM