Python自定义包子目录测试脚本相对导入无已知父包报错问题咨询
问题原因
你遇到的attempted relative import with no known parent package报错核心原因是:直接运行的Python脚本会被识别为顶级模块,Python不会解析它所在的目录层级作为包结构,相对导入仅适用于包内部的非入口模块,不能用于直接执行的测试脚本。
可行解决方案
下面三种方案任选即可,都不需要使用相对导入,首先将测试脚本中的导入语句改成绝对导入:
# 替换原来的相对导入写法,直接用绝对导入 from rl.training import train from rl.callbacks import Checkpoint, EarlyStop, ProgressBarCallback
方案1:开发模式安装(最规范,长期项目推荐)
这是Python打包的标准做法,一次配置永久生效:
- 在项目根目录(和
rl、tests文件夹同级的位置)新建pyproject.toml,写入最小配置:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-rl-package" version = "0.1.0" packages = ["rl"]
- 在项目根目录运行命令安装开发版包:
pip install -e . - 之后任意位置的脚本都可以直接导入
rl包下的模块,不需要调整路径。
方案2:临时添加项目根目录到导入搜索路径
适合临时测试、不想做打包配置的场景,在测试脚本的最开头添加以下代码:
import sys from pathlib import Path # 路径层级对应你的测试脚本位置:tests/cartpole-v1/train.py 往上跳3级就是项目根 sys.path.append(str(Path(__file__).parent.parent.parent.resolve()))
添加后再执行绝对导入语句即可正常运行。
方案3:用测试运行器执行脚本
如果你用pytest做测试管理,不需要修改任何代码,只要在项目根目录运行测试命令即可:pytest tests/cartpole-v1/train.py
pytest会自动将当前执行命令的目录加入Python的导入搜索路径,绝对导入可以直接生效。
内容的提问来源于stack exchange,提问作者Chase R Lewis
相关产品推荐
相关产品推荐

