调整Python包与模块结构以适配pytest及VS Code环境
问题背景
当前目录结构:
memsim/ __init__.py utils.py tests/ __init__.py utils_test.py
utils.py中定义函数:
def flatten_free_segments(free_segments):
utils_test.py的导入语句:
from utils import flatten_free_segments
测试执行结果:
$ python -m unittest discover --> 未找到测试用例 $ python -m unittest tests/utils_test.py --> 执行正常
同时VS Code的Pylance工具出现导入报错,调试环节也存在问题。
用户咨询两个问题:
- 该基础目录结构及导入语句是否合法且为正确方式?
- 如何让Pylance和VS Code测试运行器适配当前设置?
问题1:目录结构与导入语句的合法性
当前的导入方式不合法,也不符合Python工程化的标准做法,原因如下:
- 执行
python -m unittest discover时,Python会从当前工作目录开始扫描测试用例,但tests/utils_test.py里的from utils import...会默认在tests/目录下查找utils.py,而非上层目录的文件,导致导入逻辑混乱,这也是discover找不到测试用例的核心原因。 - 直接跨目录使用
from utils import...属于不规范的导入写法,在Python包结构中,跨目录导入应该使用绝对导入或正确的相对导入。
正确的调整方式:
- 把
memsim作为顶层可导入包,在utils_test.py中改用绝对导入:from memsim.utils import flatten_free_segments - 或者使用相对导入(仅适用于包内部的模块间导入):
from ..utils import flatten_free_segments - 之后在
memsim/的父目录下执行python -m unittest discover,就能正常识别测试用例。
问题2:适配Pylance与VS Code测试运行器
解决Pylance导入报错
- 确认Python解释器路径:通过VS Code左下角的Python解释器选择器,选中当前项目使用的Python环境,确保环境能识别
memsim包。 - 添加额外路径配置:
- 在
memsim/的父目录下创建pyproject.toml,添加:[tool.pyright] extraPaths = ["."] - 或者直接在VS Code工作区的
settings.json中添加:{ "python.analysis.extraPaths": ["${workspaceFolder}"] }
memsim的父目录)加入Python路径,从而正确识别memsim包。 - 在
适配VS Code测试运行器
- 配置测试发现规则:在VS Code的
settings.json中添加如下配置,指定测试目录和匹配规则:{ "python.testing.unittestArgs": [ "-v", "-s", "./memsim/tests", "-p", "*test.py" ], "python.testing.pytestEnabled": false, "python.testing.unittestEnabled": true } - 设置正确的工作目录:将VS Code的工作区设置为
memsim的父目录,确保测试运行器能识别memsim包,避免导入报错。
内容的提问来源于stack exchange,提问作者pitosalas
相关产品推荐
相关产品推荐

