Python 从父目录之外的包导入子包



我有以下文件夹结构:

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添加到模块搜索路径中,因此serviceyolov被视为顶级包。 然而,commyolov5.models中,这不是一个顶级包。由于expcomm都在同一包中定义,因此您只需要一个前导.来引用comm,而不是像其他两个示例中那样..。类似地,在exp.py中,前导..指的是包含utils模块的yolov5

最新更新