
当 python 脚本以非包方式直接运行(如 python baselines/random/random.py)时,其 __package__ 为 none,导致相对导入失败;解决核心是手动将项目根目录加入 sys.path,使绝对导入 utils.general_utils 可用。
在你描述的项目结构中,random.py 被 os.system("python Baselines/random/random.py") 独立执行,此时它不是作为包成员被导入,而是作为顶层脚本运行——Python 不会自动识别其所属包层级,因此 from ..Utils.general_utils import * 等相对导入必然报错:ImportError: attempted relative import with no known parent package。
✅ 正确解法不是强行改用相对路径,而是恢复绝对导入能力。关键在于:让 random.py 能通过 import Utils.general_utils 找到模块。这需要两个前提:
- 所有中间目录(Project/, Utils/, Baselines/, random/)均含空 __init__.py 文件(你已满足);
- 将项目根目录(即 Project/ 的父路径)动态添加到 sys.path,使 Python 模块搜索器能定位 Utils 包。
在 Baselines/random/random.py 开头添加以下代码:
import sys from pathlib import Path # 将 Project/ 根目录加入 Python 路径(向上追溯两级:random → Baselines → Project) root_dir = Path(__file__).resolve().parent.parent.parent sys.path.insert(0, str(root_dir)) # 现在可安全使用绝对导入 from Utils.general_utils import some_function # ✅ 成功 # 或 import Utils.general_utils as gu
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- sys.path.insert(0, ...) 优于 append(),确保根路径优先于其他路径(避免同名模块冲突);
- Path(__file__).resolve() 获取脚本绝对路径,parent.parent.parent 精准指向 Project/ 目录(因 random.py 路径为 Project/Baselines/random/random.py);
- 切勿在 main.py 中对 random.py 使用 import ——你当前用 os.system 启动它是合理的,因为 random.py 需要独立进程上下文;若改为 import,则 __package__ 仍可能为 None,且破坏进程隔离性;
- 若未来需支持 python -m Baselines.random.random 运行方式,则应确保 Project/ 在 PYTHONPATH 中,并统一使用绝对导入(无需修改 sys.path)。
总结:相对导入仅适用于“被导入”的模块(__package__ 非空),而直接执行的脚本必须主动扩展模块搜索路径。通过 pathlib 动态计算并注入根路径,是最健壮、跨平台且无需环境变量配置的解决方案。










