Python项目模块导入错误咨询:相对导入无父包及utils子模块导入失败问题
先梳理下你的项目结构(方便后续分析):
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中运行测试脚本就不会报错了。
总结
你的包结构没问题,问题出在两个点:
- 错误地直接运行了
__init__.py文件; - Python的模块搜索路径没有包含项目根目录,导致找不到
object_detection包。
按照上面的方法解决后,两个导入错误都能修复。
内容的提问来源于stack exchange,提问作者learner




