运行导入同根目录其他模块的脚本时出现No module错误如何解决?
Python导包报错问题分析与解决
报错原因
Python 导入模块时会从 sys.path 存储的路径列表中搜索目标模块,直接运行单文件脚本时,Python 会自动将脚本所在的目录(也就是本场景下的 dir/tests/e2e_tests)加入 sys.path,但不会将执行命令的当前工作目录(即 dir 目录)加入搜索路径。subdir 模块存放在 dir 目录下,不在默认搜索路径中,因此触发 ModuleNotFoundError。
解决方案
可以按需选择以下任意一种方案解决:
- 以模块形式运行脚本
不要直接指定脚本文件路径运行,改用-m参数以模块方式执行,在dir目录下执行以下命令即可:
这种方式会自动将当前工作目录加入python -m tests.e2e_tests.test1sys.path,不需要修改代码或环境配置。 - 代码内临时添加搜索路径
在test1.py最开头添加代码,将项目根目录(dir目录)手动加入sys.path:
添加后再运行原有命令即可正常导包。import sys from pathlib import Path # 从test1.py所在路径往上跳3层,定位到dir目录 project_root = Path(__file__).parent.parent.parent sys.path.append(str(project_root)) - 配置PYTHONPATH环境变量
运行脚本前先将dir目录的绝对路径加入PYTHONPATH环境变量:- Windows cmd:
set PYTHONPATH=你的dir目录绝对路径;%PYTHONPATH% - Windows PowerShell:
$env:PYTHONPATH="你的dir目录绝对路径;$env:PYTHONPATH" - Linux/macOS:
export PYTHONPATH=你的dir目录绝对路径:$PYTHONPATH
配置完成后再执行原有运行命令即可。
- Windows cmd:
- 使用测试框架运行
如果是测试代码,直接用pytest等测试框架运行即可,这类框架会自动将当前工作目录加入sys.path,在dir目录下执行:pytest tests/e2e_tests/test1.py
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

