我有以下文件夹结构:
main_dir
- api
- api.py
- __init__.py
- service
- service.py
- __init__.py
- yolov5
- __init__.py
- models
- exp.py
- comm.py
- __init__.py
- utils
- downloads.py
- __init__.py
- __init__.py
The files contain the following imports:
api.py
from service import detect (detect is a custom class I created in service.py)
service.py
from yolov5.models.exp import attempt_load
exp.py
from models.comm import conv
from utils.downloads import attempt_download
From main_dir I run: python -m api.api
当我运行上述命令时,我得到: ModuleNotFoundError:exp.py 中没有名为"models"的模块。
据我了解,yolov5 包正在正确导入,但子包模型和实用程序无法导入或无法从 exp.py 引用
当我将 exp.py 中的导入语句从以下更改时,该问题已解决:
from models.comm import conv
from utils.downloads import attempt_download
自
from yolov5.models.comm import conv
from yolov5.utils.downloads import attempt_download
但我不想这样做,因为我将不得不更改不同文件中的多个导入语句。 如何正确导入子包?另外,应该更改 python run 命令还是从不同的目录运行?
您可能希望使用相对导入。您的所有代码都属于一个名为main_dir
的巨型包。因此,您可以使用该包引用其他模块。
# api.py
from ..service import detect (detect is a custom class I created in service.py)
# service.py
from ..yolov5.models.exp import attempt_load
# exp.py
from .comm import conv
from ..utils.downloads import attempt_download
带有前导.
的模块名称是指当前包中的模块(即,包含正在定义的模块的包)。带有前导..
的模块名称是指包含当前包的包中的模块,依此类推。
我怀疑您的前两个工作原封不动,因为您已将main_dir
添加到模块搜索路径中,因此service
和yolov
被视为顶级包。 然而,comm
在yolov5.models
中,这不是一个顶级包。由于exp
和comm
都在同一包中定义,因此您只需要一个前导.
来引用comm
,而不是像其他两个示例中那样..
。类似地,在exp.py
中,前导..
指的是包含utils
模块的yolov5
。