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,相对导入就能正常工作。
方案二:统一使用绝对导入+包方式运行脚本
- 把
middle/middle_file.py的导入语句改为绝对路径:
from middle.lower.lower_file import Person, Animal
- 永远在upper的父目录下,用
-m参数以包的方式运行脚本:- 运行upper_file.py:
python -m upper.upper_file - 运行middle_file.py:
python -m upper.middle.middle_file
- 运行upper_file.py:
- 在PyCharm中,把upper的父目录设置为项目根目录:右键该目录 →
Mark Directory as→Sources Root,这样PyCharm就能正确识别包结构,不会再标红。
内容的提问来源于stack exchange,提问作者mayool

