Python测试文件置于独立目录时出现Module not found错误求助
解决测试文件夹导入主目录模块的问题
先明确你的项目结构应该是这样:
你的项目根目录/ ├── main.py └── tests/ └── test.py
出现module main not found的核心原因是Python的模块搜索路径(sys.path)不包含项目根目录:当你直接在tests文件夹里运行test.py时,Python只会把tests/目录加入搜索路径,上层的根目录不在里面,自然找不到main.py对应的模块。
给你三种实用的解决办法:
1. 从根目录以模块方式运行测试
打开终端,切换到项目根目录,执行:
python -m tests.test
这时候Python会把项目根目录加入搜索路径,test.py里直接写import main就能正常导入。如果想用相对导入,test.py里可以写:
from .. import main
注意:相对导入只能在以模块方式运行时生效,不能直接双击或用python tests/test.py运行。
2. 在测试脚本中手动添加根目录到搜索路径
在test.py开头加入这段代码,强制把项目根目录加入Python的搜索路径:
import sys from pathlib import Path # 获取当前脚本所在目录的上层目录(也就是项目根目录) project_root = Path(__file__).parent.parent sys.path.append(str(project_root)) # 现在可以正常导入main了 import main
这种方式不需要改运行命令,直接运行test.py也能生效,适合快速调试。
3. 将项目转为可安装包(推荐长期项目)
如果你的项目是长期维护的,推荐把它变成标准的Python包,这样不管在哪都能正常导入模块:
- 在项目根目录创建
setup.py文件,内容如下:
from setuptools import setup, find_packages setup( name="你的项目名称", version="0.1.0", packages=find_packages(), # 如果main.py不在包目录里,还可以加: # py_modules=["main"], )
- 在根目录执行命令,把项目安装为可编辑模式:
pip install -e .
之后不管你在哪运行test.py,直接写import main就能成功导入。
额外注意
- 不要给模块起和Python标准库重名的名字(比如不要把
main.py改成sys.py),否则会优先导入标准库模块,引发奇怪问题。 - Python 3.3+支持命名空间包,
tests文件夹里不需要空的__init__.py,但如果用相对导入,加一个空的__init__.py能让结构更清晰。
内容的提问来源于stack exchange,提问作者Isaac Kenney
相关产品推荐
相关产品推荐

