参考 https://zhuanlan.zhihu.com/p/416867942
Q:
为什么我使用
import sys
sys.path.insert(0, '../LongCLIP/model')
import longclip
会报错
Traceback (most recent call last):
File "d:\xxx\yyy\empty.py", line 4, in <module>
import longclip
File "D:\xxx\yyy\../LongCLIP/model\longclip.py",
line 13, in <module>
from .model_longclip import build_model
ImportError: attempted relative import with no known parent package,
而使用
import sys
sys.path.insert(0, '../LongCLIP')
from model import longclip
则能正常执行
A:
这个问题的原因在于Python的包和模块导入机制。当你使用import longclip
时,Python会尝试在sys.path
列表中的每个目录下查找名为longclip.py
的文件。当找到这个文件并尝试执行它时,它并不知道它是作为一个包的一部分被导入的,因此,它不能识别相对导入from .model_longclip import build_model
。
然而,当你使用from model import longclip
时,Python会在sys.path
列表中的每个目录下查找名为model
的目录,并在该目录下查找__init__.py
文件和longclip.py
文件。在这种情况下,Python知道longclip.py
是作为model
包的一部分被导入的,因此,它能正确处理相对导入。
这就是为什么from model import longclip
可以正常工作,而import longclip
会导致错误的原因。