vcrpy测试文件如何从父目录导入模块?
问题
在vcrpy项目里,tests/integration/test_filter.py这个测试文件直接导入了父目录下的assertions模块(写法是from assertions import ...),既没用常规的相对导入from ..assertions import ...,代码里也没修改PYTHONPATH,为啥能正常跑起来?
背后的机制
核心原因是项目靠pytest的配置文件悄悄修改了Python的模块搜索路径:
- 项目根目录下的
pytest.ini里有一行配置pythonpath = tests,这条配置会让pytest在启动测试时,自动把tests目录加到Python的模块搜索路径(sys.path)里。 - 等
tests目录进了搜索路径,该目录下的所有.py文件就都变成了可以直接导入的顶层模块——所以test_filter.py里直接写from assertions import ...,Python就能找到tests/assertions.py这个文件,根本不需要用相对导入。
顺带提一句:pytest本身默认也会把运行命令的目录(也就是项目根目录)加到sys.path,但这里起关键作用的还是pytest.ini里的pythonpath配置,把tests目录直接拉进了搜索路径,才实现了跨子目录的直接导入。
内容的提问来源于stack exchange,提问作者Sharad
相关产品推荐
相关产品推荐

