You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python层级模块与包导入错误问题求助

问题根源:Python模块搜索路径的差异

你的问题本质是Python运行脚本和导入模块时,sys.path(模块搜索路径)的构成不同,导致导入语句的生效条件不一样:

1. 直接运行middle_file.py能成功的原因

当你直接运行middle/middle_file.py时,Python会把middle目录加入到sys.path的最前面。此时from lower.lower_file import ...中的lower是middle目录下的子目录,属于sys.path里的可搜索路径,所以能找到。

2. 运行upper_file.py报错的原因

当你运行upper/upper_file.py时,Python会把upper目录加入到sys.path。此时导入middle.middle_file后,middle_file里的from lower...会在sys.path(也就是upper目录)里找lower模块,但upper目录下根本没有lower文件夹,自然报错ModuleNotFoundError。

而你在upper_file.py里用from middle.lower.lower_file import *能成功,是因为这个路径是基于sys.path里的upper目录(middle是upper的子目录,lower是middle的子目录),符合搜索规则。

3. 修改导入语句后middle_file.py无法运行的原因

把middle_file.py的导入改成from middle.lower.lower_file import ...后,直接运行middle_file.py时,sys.path是middle目录,Python会在middle目录下找middle文件夹,显然不存在,所以报错,PyCharm也因为识别不到这个层级而标红。


解决方案

根据你的需求(upper_file能访问middle_file,同时middle_file自身也能正常运行),推荐两种可行方案:

方案一:使用相对导入

在middle/middle_file.py中改用相对路径导入:

from .lower.lower_file import Person, Animal
  • 解释:.代表当前模块所在的包(也就是middle包),这样不管是被upper_file导入,还是直接运行middle_file.py,都能正确找到lower模块。
  • 注意:如果直接运行middle_file.py时出现ImportError: attempted relative import with no known parent package,可以在upper的父目录下用包方式运行:python -m upper.middle.middle_file,这样Python会把upper的父目录加入sys.path,相对导入就能正常工作。

方案二:统一使用绝对导入+包方式运行脚本

  1. 把middle/middle_file.py的导入语句改为绝对路径:
from middle.lower.lower_file import Person, Animal
  1. 永远在upper的父目录下,用-m参数以包的方式运行脚本:
    • 运行upper_file.py:python -m upper.upper_file
    • 运行middle_file.py:python -m upper.middle.middle_file
  2. 在PyCharm中,把upper的父目录设置为项目根目录:右键该目录 → Mark Directory as → Sources Root,这样PyCharm就能正确识别包结构,不会再标红。

内容的提问来源于stack exchange,提问作者mayool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:40:21