You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python项目模块导入错误咨询:相对导入无父包及utils子模块导入失败问题

解决Python包导入错误:相对导入失败与模块无法导入问题

先梳理下你的项目结构(方便后续分析):

Object_Detection/
  setup.py
  setup.cfg
  requirement.txt
  object_detection/
    models/
      __init__.py  # 内容:from . import models
    tests/
      test_utils_image.py
      __init__.py  # 空文件
    utils/
      __init__.py  # 内容:from . import utils_image_preprocess; from . import utils_image; from . import utils_tfrecord
      utils_image_preprocess.py
      utils_image.py
      utils_tfrecord.py

你的包结构是否正确?

你的项目结构是标准的Python可安装包结构,本身没有问题。问题出在包的使用方式和Python路径配置上。


逐个解决你的导入错误

1. 运行utils/__init__.py时的ImportError: attempted relative import with no known parent package

这个错误的原因很直接:__init__.py不是用来直接运行的脚本。它的作用是标记目录为Python包,并且在包被导入时自动执行初始化代码。当你直接运行它时,Python会把它当成一个独立的顶层脚本,此时from . import ...这种相对导入没有对应的父包上下文,自然会报错。

解决方法
永远不要直接运行__init__.py文件。如果你要测试utils里的模块,直接运行对应的模块文件(比如utils_image.py),或者写测试脚本(比如你的test_utils_image.py)来导入使用。


2. 运行tests/test_utils_image.py时的ImportError: cannot import name 'utils_image' from 'object_detection.utils'

这个错误的核心是:Python的模块搜索路径里没有包含你的项目根目录(Object_Detection/。当你在tests/目录下运行测试脚本时,Python找不到object_detection这个包,因为它不在默认的搜索路径里。

这里提供3种解决方法,按推荐程度排序:

方法1:以可编辑模式安装本地包(推荐,适合长期开发)

在项目根目录(Object_Detection/)下打开终端,运行:

pip install -e .

这个命令会把你的本地包以"可编辑"模式安装到Python环境中,相当于告诉Python:object_detection包就在这个目录里,以后不管你在哪个位置运行脚本,都能直接导入这个包。

方法2:临时设置PYTHONPATH环境变量

如果你不想安装包,可以临时把项目根目录加入Python的搜索路径:

  • Linux/macOS
    export PYTHONPATH=/绝对路径/到/Object_Detection:$PYTHONPATH
    python tests/test_utils_image.py
    
  • Windows(命令提示符)
    set PYTHONPATH=C:\绝对路径\到\Object_Detection;%PYTHONPATH%
    python tests\test_utils_image.py
    
  • Windows(PowerShell)
    $env:PYTHONPATH = "C:\绝对路径\到\Object_Detection;$env:PYTHONPATH"
    python tests\test_utils_image.py
    

方法3:在测试脚本中手动添加路径

test_utils_image.py的最顶部添加以下代码,手动把项目根目录加入Python的搜索路径:

import sys
from pathlib import Path

# 找到项目根目录(当前脚本的父目录的父目录)
project_root = Path(__file__).parent.parent
sys.path.append(str(project_root))

# 现在就能正常导入了
from object_detection.utils import utils_image

关于IDE设置的问题

你提到的VSCode和PyCharm的问题,本质上也是源代码根目录的配置

  • VSCode:打开项目后,右键点击Object_Detection目录,选择「将文件夹添加到工作区」;或者在.vscode/settings.json中添加:
    {
        "python.analysis.extraPaths": ["${workspaceFolder}"]
    }
    
  • PyCharm:打开项目后,右键点击Object_Detection目录,选择「Mark Directory as」→「Sources Root」。

配置完成后,IDE会自动把项目根目录加入Python的搜索路径,这样在IDE中运行测试脚本就不会报错了。


总结

你的包结构没问题,问题出在两个点:

  1. 错误地直接运行了__init__.py文件;
  2. Python的模块搜索路径没有包含项目根目录,导致找不到object_detection包。

按照上面的方法解决后,两个导入错误都能修复。

内容的提问来源于stack exchange,提问作者learner

火山引擎 最新活动