为什么仅运行pytest时Python项目主源文件会出现导入错误?
问题原因
报错的核心是pylib_example/pyfile2.py中的导入写法不符合Python包导入规范:你在pyfile2中直接写import pyfile1属于顶层模块导入,Python会从sys.path(模块搜索路径)中查找名为pyfile1的模块。
pytest运行时默认会把你执行命令的项目根目录~/Desktop/pylib_example加入sys.path,sys.path中不存在pyfile1.py,只有子目录pylib_example下才有该文件,因此触发ModuleNotFoundError。
为什么直接运行pyfile2不会报错
当你直接进入pylib_example子目录运行pyfile2.py时,Python会自动把当前执行文件所在的目录加入sys.path,同目录下的pyfile1可以被直接定位到,因此不会报错。
解决方案
推荐优先选择方案1,符合Python包开发的规范:
- 方案1:修改pyfile2的导入语句
将pylib_example/pyfile2.py第一行的import pyfile1改为以下两种写法任意一种即可:- 包内相对导入:
from . import pyfile1 - 全局绝对导入:
from pylib_example import pyfile1
- 包内相对导入:
- 方案2:调整pytest的模块搜索路径(无需修改源码)
方法一:在项目根目录新建pytest.ini配置文件,写入以下内容:
方法二:运行pytest时手动指定搜索路径,执行命令:[pytest] pythonpath = .PYTHONPATH=. pytest
内容的提问来源于stack exchange,提问作者preetam
相关产品推荐
相关产品推荐

