所以我使用同事设置的模板,作为python的新手,我可能会遗漏一些非常明显的东西。
主目录有init文件,它有一个生成错误的主python文件所需的模块。
使用同事:
from . import X
其中X是模块,但是当将此(以及填充的init文件)复制到我自己的目录时,它会生成此错误:
ValueError:在非包中尝试相对导入
从谷歌和我这里得知,这是完全正确和合乎逻辑的,所以我想知道,作为一个新手,我错过了什么。
答案 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 c
或b.py
)。
当您从__init__.py
目录运行python b.py
时,您无法使用相对导入,因为Python无法将pkg
识别为包:它不在pkg
中。对于Python,sys.path
是一个普通目录,无论它是否包含pkg
。 __init__.py
的完全限定名称仅为c.py
,而非c
,因此相对pkg.c
无效。