无法从模块导入子模块

学习者

我的项目有以下结构

Object_Detection/
                 setup.py
                 setup.cfg
                 requirement.txt
                 object_detection/
                                  models
                                  __init__.py #contains from . import models
                 tests/ 
                       # inside tests dir
                       test_utils_image.py
                       __init__.py #empty
                 utils/
                      # inside utils dir
                      __init__.py #inside 
                      utils_image_preprocess.py
                      utils_image.py
                      utils_tfrecord.py

现在utils 目录中的init .py 包含以下代码。

# inside __init__.py
from . import utils_image_preprocess
from . import utils_image
from . import utils_tfrecord

init .py 文件上方运行会给我一个错误:

ImportError: attempted relative import with no known parent package

测试目录中的 test_utils.py 包含以下代码

# inside test_utils.py
from object_detection.utils import utils_image

运行 test_utils.py 时出现以下错误

ImportError: cannot import name 'utils_image' from 'object_detection.utils'

我已经经历了这个这个,并试图遵循那里提到的每个方面,但关于在init .py 中放入什么的细节尚不清楚。

这个问题似乎与不同目录init .py的结构有关

我经历了各种各样的事情,知道如果我们保留一个空的init .py 文件,那么事情就会解决,但我不确定我的理解。

请告诉我

  1. 我在这里缺少什么以及我是否遵循正确的结构来打包我的代码?
  2. 如何解决这两个错误?
  3. 这个问题是否与在 IDE 中设置源有关,因为我使用的是 Vscode,我也看到很多地方都提到了这一点。看到这里了吗?(但也尝试了与 PyCharm 相同的代码并遇到了相同的错误)
布布

如果你想能够说...

from object_detection.utils import utils_image

...那么显然utils目录必须是object_detection目录的子目录,不是同级目录,即处于同一级别。

现在为您的其他错误:

ImportError: attempted relative import with no known parent package

除了说“在init .py 文件上方运行给我一个错误:”之外,您并没有真正指定在什么情况下会出现此错误但是如何“运行”这些 py 文件的,或者这意味着什么?

如果您在发生这种情况时正在执行脚本(否则您将如何收到此错误?),则必须将脚本作为模块调用(因为脚本不能具有相对导入——见下文)如下(我们将假设脚本您正在尝试执行的是test_utils_image.py):

首先,父目录object_detection,这是Object_Detection,必须在目录的系统路径进行搜索查找模块和引用的包import语句。一般来说,这可以通过几种方式完成,例如

  1. 您正在执行的脚本在Object_Detection 中(脚本的目录会自动添加到sys.path解释器要搜索的目录列表中)。
  2. 通过脚本在运行时Object_Detection动态附加sys.path目录列表中。
  3. Object_Detection附加PYTHONPATH环境变量。

上面的第 1 项不适用于这种特定情况,因为我们根据定义执行的模块不在Object_Detection目录中。

请注意,如果您的类最终将与 一起安装pip,那么site-packages将是object_detection的父目录,该目录已经在sys.path.

然后你可以执行你的脚本:

python -m tests.test_utils_image

如果您想将此 .py 文件作为脚本执行,例如通过鼠标右键单击它是 VS Code,那么请参阅第 10 亿次相对导入,特别是Scripts can't import relative 部分,它说明了一切——它不能工作!

要将其作为脚本调用,只需将相对导入转换为绝对导入。事实上,PEP 8 风格指南说:

建议使用绝对导入,因为如果导入系统配置不正确(例如当包内的目录结束时sys.path,它们通常更具可读性并且往往表现更好(或至少给出更好的错误消息):

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章