Python相对导入报错:如何无硬编码导入跨目录模块?
解决Python相对导入错误及跨目录模块导入问题
问题分析
你当前的核心问题有两个:
- 直接运行脚本时,Python无法识别相对导入的父包(报错
ImportError: attempted relative import with no known parent package),因为单独运行脚本时,该脚本不属于任何包结构。 - 你添加的
sys.path只包含了/new/uiautomation/目录,根目录/new/下的apis模块不在搜索路径里,所以无法导入restapi.py。
解决方案
无需硬编码项目目录名new,可以通过动态获取项目根目录并添加到sys.path,再使用绝对导入解决问题:
1. 动态添加项目根目录到sys.path
修改dropdown_test.py中的路径配置代码:
import sys from os import path # 从当前脚本路径往上回溯3层,得到项目根目录(/new/) project_root = path.dirname(path.dirname(path.dirname(path.abspath(__file__)))) # 将根目录加入Python模块搜索路径 sys.path.append(project_root)
2. 使用绝对导入语句替换原有导入
修改导入代码为:
# 导入uiautomation目录下的runner模块 from uiautomation.apis.runner import Runner # 导入根目录下的restapi模块 from apis.restapi import Login
为什么之前的尝试失败?
- 相对导入
from ..apis.restapi import Login仅适用于脚本作为包的一部分被导入(比如通过python -m uiautomation.testscripts.dropdown_test运行),直接运行脚本时,Python不会将其视为包的成员,因此无法解析相对路径。 - 你之前添加的
sys.path仅包含/new/uiautomation/,根目录下的apis不在搜索范围内,所以from apis.runner import Runner也无法找到正确的模块(它会去/new/uiautomation/apis找,但你要的是/new/apis)。
内容的提问来源于stack exchange,提问作者Ammad
相关产品推荐
相关产品推荐

