[英]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.