
当 Python 脚本位于子目录中时,因当前工作目录未自动加入 sys.path,相对包导入会失败;需通过调整导入方式、设置执行上下文或规范包结构来解决。
当 python 脚本位于子目录中时,因当前工作目录未自动加入 sys.path,相对包导入会失败;需通过调整导入方式、设置执行上下文或规范包结构来解决。
在你的项目结构中,find_observibility.py 本应作为 kalman 包的一部分被以模块方式运行,而非直接作为脚本执行。你当前执行 ./kalman/find_observibility.py 的方式会导致 Python 将 kalman/ 目录视为顶层(__main__ 模块的 __file__ 所在目录),此时 from kalman import ... 实际是在尝试从当前工作目录的同级导入 kalman 包——但当前工作目录是项目根目录的子目录(即 kalman/),而 kalman/ 内部又没有嵌套的 kalman/kalman/,因此触发 ModuleNotFoundError: 'kalman' is not a package。
根本原因在于:Python 不会自动将当前工作目录(os.getcwd())加入 sys.path,也不支持“脚本所在目录自动成为包根”这一隐式行为。__init__.py 的存在仅使该目录可被识别为包,但能否成功导入仍取决于模块搜索路径(sys.path)和执行方式。
✅ 正确解决方案如下(按推荐优先级排序):
1. 使用 -m 参数以模块方式运行(推荐)
确保项目根目录(含 kalman/ 子目录)在 sys.path 中(即你在项目根目录下执行):
# 在项目根目录(.)下执行 cd /path/to/your/project python -m kalman.find_observibility
⚠️ 注意:
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 要求
kalman/__init__.py存在(你已满足); - 脚本名需去掉
.py后缀,用点号分隔层级; - 此方式让 Python 将当前目录加入
sys.path,并以kalman.find_observibility为完整模块名加载,所有相对/绝对导入均按包结构解析。
2. 修复 kalman/kalman.py 中的错误导入(关键修正)
你提供的答案中建议改为 from model import ... 是不安全且不可扩展的——它破坏了包层级,且当 model.py 移动或重命名时极易出错。真正应做的是:
✅ 统一使用显式相对导入(在 kalman/kalman.py 中):
# kalman/kalman.py 第6行(原错误行) # ❌ 错误:from kalman.model import ... → 导入绝对路径,依赖 sys.path # ✅ 正确:使用相对导入(因同属 kalman 包) from .model import modelOutput, stateTransition
同样,确保 find_observibility.py 中的导入也适配模块执行模式:
# find_observibility.py(保留在 kalman/ 下)
#!/usr/bin/env python3
# ✅ 改为相对导入(仅当以 python -m kalman.find_observibility 运行时有效)
from . import outputJacobian, stateJacobian, stateTransition
# 或保持绝对导入(推荐,因 __init__.py 已导出)
from . import outputJacobian, stateJacobian, stateTransition
from make_flight import Rising, Rounds
if __name__ == '__main__':
print('oh my')
3. (不推荐)临时修改 sys.path(仅用于调试)
若必须直接执行脚本(如双击运行),可在 find_observibility.py 开头手动添加项目根目录:
#!/usr/bin/env python3 import sys from pathlib import Path # 将项目根目录(kalman 的父目录)加入路径 sys.path.insert(0, str(Path(__file__).parent.parent)) # 然后正常导入 from kalman import outputJacobian, stateJacobian, stateTransition ...
⚠️ 缺陷:硬编码路径、污染全局 sys.path、不利于部署与测试。
总结与最佳实践
- ? 避免直接执行子目录下的
.py文件(如./kalman/xxx.py); - ✅ 始终使用
python -m package.module方式运行包内脚本; - ✅ 包内模块间统一使用
from .xxx import yyy相对导入; - ✅ 确保每个包目录含
__init__.py(即使为空); - ✅ 将项目根目录设为 Python 模块搜索起点(通过
PYTHONPATH或setup.py安装为可编辑包)。
遵循以上原则,即可彻底解决子目录脚本导入失败问题,并构建可维护、可移植的 Python 包结构。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










