已添加__init__.py仍无法找到模块?Python导入问题咨询
Python模块导入问题解析
问题1:在project目录执行python ./test/test1.py找不到lib模块
Python的模块搜索路径(sys.path)默认优先取脚本文件所在的目录,而非当前工作目录(os.getcwd()返回的路径)。你执行python ./test/test1.py时,sys.path的首元素是project/test/,而非project/,所以无法定位到同级的lib文件夹。
问题2:在test目录加sys.path.append('..')能运行,但上层目录不行
在project/test/目录执行脚本时,..指向project/目录,将其加入sys.path后,Python就能找到lib模块。但回到project/目录执行时,..指向的是project的父目录,而非project本身,自然找不到目标模块。
问题3:添加__init__.py仍报错
__init__.py的作用是将文件夹标记为Python可识别的包,但它无法修改模块搜索路径。你的核心问题是sys.path未包含project/目录,因此加了__init__.py也无法解决找不到模块的问题。
问题4:相对导入报错attempted relative import with no known parent package
相对导入(如from .lib...)仅适用于被作为包导入的模块,不能在直接运行的脚本中使用。你直接执行test1.py时,Python将其视为独立脚本,而非某个包的子模块,因此无法识别相对路径中的父包。
可行的解决方法
方案1:动态添加project目录到sys.path
在test1.py开头添加以下代码,确保无论从哪个目录执行都能定位到lib:
import sys from pathlib import Path # 获取project目录的绝对路径 project_root = Path(__file__).parent.parent sys.path.append(str(project_root)) from lib.lib1 import MyClass
方案2:使用-m参数以包模式运行
回到project目录,执行以下命令:
python -m test.test1
这种方式会自动将project目录加入sys.path,同时将test视为包。此时你也可以把test1.py中的导入改为相对导入:
from ..lib.lib1 import MyClass
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

