
当 Python 脚本位于子目录(如 kalman/find_observibility.py)中时,因当前工作目录非项目根目录,相对包导入(如 from kalman.model import ...)会失败;需通过调整导入方式、修改执行路径或规范包结构来解决。
当 python 脚本位于子目录(如 `kalman/find_observibility.py`)中时,因当前工作目录非项目根目录,相对包导入(如 `from kalman.model import ...`)会失败;需通过调整导入方式、修改执行路径或规范包结构来解决。
在 Python 中,模块导入行为严格依赖于 sys.path 和当前工作目录(CWD)。你遇到的错误:
ModuleNotFoundError: No module named 'kalman.model'; 'kalman' is not a package
根本原因在于:当你在子目录(如 ./kalman/)下直接执行 python find_observibility.py 时,Python 将当前目录(./kalman/)加入 sys.path,而非项目根目录。此时解释器尝试从 ./kalman/kalman.py 中执行 from kalman.model import ...,但 ./kalman/ 下并不存在名为 kalman 的子包(即 ./kalman/kalman/),因此 kalman 不被视为可导入的包——导致链式导入崩溃。
✅ 正确解决方案(推荐按优先级排序)
1. 始终从项目根目录以模块方式运行(最规范)
不要直接执行子目录下的 .py 文件,而是用 -m 参数以模块形式运行,并确保根目录在 sys.path 中(通常默认满足):
# 在项目根目录下执行(即包含 kalman/ 的目录) cd /path/to/your/project python -m kalman.find_observibility
⚠️ 前提:kalman/__init__.py 存在(你已提供),且 find_observibility.py 位于 kalman/ 下(符合 Python 包结构)。此时 find_observibility.py 应移除 shebang 行(#! /usr/bin/env python3),因其在 -m 模式下不生效,且可能干扰环境。
✅ 优点:符合 Python 包管理规范,支持绝对导入、可复用、无路径硬编码。
❌ 错误做法:./kalman/find_observibility.py(直接执行)或python kalman/find_observibility.py(非模块模式)。
2. 修复 kalman.py 中的错误导入(治标但必要)
你提供的 kalman/kalman.py 第 6 行写的是:
from kalman.model import modelOutput, stateTransition # ❌ 错误:在 kalman/ 目录下,kalman 不是子包
应改为相对导入(因它与 model.py 同属 kalman 包):
使用 font_manager.addfont() 添加中文字体文件,设置 rcParams['font.family'],并禁用 unicode_minus,使 matplotlib 显示中文。
# kalman/kalman.py from .model import modelOutput, stateTransition # ✅ 正确:同包内相对导入
同样,检查 kalman/__init__.py 中的导入是否全部使用 . 前缀(你已正确使用 from .model import ...,很好)。
3. (不推荐)动态修改 sys.path(仅用于调试或遗留场景)
若必须直接运行子目录脚本,可在 find_observibility.py 开头手动将项目根目录加入路径:
#!/usr/bin/env python3
import sys
from pathlib import Path
# 将项目根目录(即包含 kalman/ 的父目录)加入 sys.path
root = Path(__file__).parent.parent.resolve()
sys.path.insert(0, str(root))
from kalman import outputJacobian, stateJacobian, stateTransition
from make_flight import Rising, Rounds
if __name__ == '__main__':
print('oh my')
⚠️ 注意:
if '__main__' == __name__:应为if __name__ == '__main__':(原代码有拼写错误)。
? 验证结构完整性
确保以下文件存在且内容合理:
-
kalman/__init__.py(已存在,内容正确) -
kalman/model.py(导出modelOutput,stateTransition等) -
kalman/kalman.py(已修正为from .model import ...) -
make_flight.py位于项目根目录(否则from make_flight import ...也会失败)
? 总结
| 方法 | 是否推荐 | 适用场景 |
|---|---|---|
python -m kalman.find_observibility(根目录执行) |
✅ 强烈推荐 | 标准化开发、测试、CI/CD |
修正为相对导入(.model) |
✅ 必须做 | 所有包内模块间引用 |
动态 sys.path 注入 |
⚠️ 临时方案 | 快速验证,避免重构 |
遵循“包内用相对导入,跨包用 -m 执行”原则,即可彻底规避路径陷阱,构建健壮可维护的 Python 项目结构。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










