Python同包导入报ModuleNotFoundError:PyCharm正常bash运行报错求助
跨平台运行触发
ModuleNotFoundError的解决方法 问题本质
- Windows下PyCharm能正常运行的原因是,PyCharm默认会自动将项目最外层根目录(即和
application、lib同级的目录) 注入Python的模块搜索路径sys.path,因此从根目录开始的全路径导入语句能被正常识别。 - 切换到Linux/macOS bash环境运行时报错,是因为直接运行
application/model/games.py时,Python默认仅将games.py所在的目录(也就是application/model/)加入模块搜索路径,无法向上检索到顶层的application包,因此触发找不到模块的报错。
具体解决方法(按推荐优先级排序)
- 从项目根目录以模块方式启动程序
不要直接进入application/model目录运行games.py,先在bash中切换到项目最外层根目录,使用Python的模块调用命令启动:python -m application.model.games
这种方式会自动将当前所在的根目录加入模块搜索路径,全路径导入逻辑能在Windows、Linux、macOS三端保持一致的运行效果。 - 调整同包内的导入语句为相对导入
games.py和lock.py、pointClass.py本来就同属application.model包目录下,完全没必要使用从根目录开始的全路径导入。将原有导入语句做如下替换:
原导入代码:from application.model.lock import RWLockfrom application.model.pointClass import *
替换为同包相对导入:from .lock import RWLockfrom .pointClass import *
修改后只要包结构完整,同包模块的导入就不会受运行目录影响。注意:使用相对导入的文件不能被直接作为独立脚本运行,必须通过模块调用的方式启动。 - 通过环境变量临时指定模块搜索路径
如果不想修改原有代码和启动逻辑,可以在运行脚本前,通过bash设置环境变量,将项目根目录加入Python的搜索路径:export PYTHONPATH=/你的项目根目录的绝对路径:$PYTHONPATH
配置完成后再执行原有启动命令,Python就能正常检索到顶层的application包。
排坑提醒
- 确认
application目录、application/model目录下都存在空的__init__.py文件,否则Python不会将这两个目录识别为可导入的包结构。 - 不要在代码里硬编码路径拼接、手动修改
sys.path的方式找模块,这类写法很容易因为不同用户的项目存放路径差异触发新的运行错误。
内容的提问来源于stack exchange,提问作者Mario Avolio
相关产品推荐
相关产品推荐

