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

Python导入场景、pytest运行差异及__init__.py作用机制疑问

Python导入模块的核心逻辑是按照sys.path列表中的路径顺序逐一匹配要导入的模块,能找到就导入,找不到就报ModuleNotFoundError。sys.path的默认值和执行命令的方式强相关,是所有导入问题的核心根源。

问题1:未添加./tests/__init__.py时,直接运行pytest失败、python -m pytest成功的原因是什么?
  • 直接运行pytest时,pytest是作为独立的可执行程序启动,它的默认规则是:将每个测试文件所在的目录自动加入sys.path。此时测试文件在./tests目录下,所以sys.path里只有./tests路径,没有你执行命令的仓库根目录,自然找不到根目录下的example包。
  • 运行python -m pytest时,是将pytest作为Python模块启动,Python解释器的-m参数默认会将当前执行命令的工作目录(也就是仓库根目录)加入sys.path的最优先级位置,此时sys.path包含根目录,能正常找到example包。
问题2:给tests目录添加__init__.py后,直接运行pytest也能成功的原因是什么?

pytest有专门的路径处理规则:如果检测到测试目录是合法的Python包(即目录下存在__init__.py),就不会再把测试文件所在目录加入sys.path,转而将执行pytest命令的工作目录(仓库根目录)加入sys.path。此时sys.path包含根目录,直接运行pytest也能正常找到example包。

问题3:temp目录添加__init__.py后直接运行脚本仍然失败,和tests场景表现不同的原因是什么?

两种场景的底层逻辑完全不同:

  • tests场景的路径调整是pytest框架自己实现的特殊规则,和Python解释器原生行为无关。
  • 直接运行python temp/temp.py是Python解释器的原生行为:不管脚本所在目录有没有__init__.py,解释器都会将被执行脚本所在的目录(也就是./temp)加入sys.path的最优先级位置,不会自动加入仓库根目录,sys.path里没有根目录自然找不到example包。
    而用python -m temp.temp运行是模块运行模式,会将当前工作目录(根目录)加入sys.path,所以可以正常导入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:15:04