Python 从父目录运行的Pytest?
我开始使用pytest,我想我的设置有问题 我有一个名为“cyan”的目录,里面有我所有的代码。它有一些顶级的东西和一个lib目录,其中包含所有正常工作的代码 我有一个tests目录,我试图在其中放置pytest测试 我目前有一个测试:测试A:Python 从父目录运行的Pytest?,python,pytest,Python,Pytest,我开始使用pytest,我想我的设置有问题 我有一个名为“cyan”的目录,里面有我所有的代码。它有一些顶级的东西和一个lib目录,其中包含所有正常工作的代码 我有一个tests目录,我试图在其中放置pytest测试 我目前有一个测试:测试A: import pytest from cyan.lib import dataCrunch import os,sys def test_foo(): print os.getcwd() print sys.path asser
import pytest
from cyan.lib import dataCrunch
import os,sys
def test_foo():
print os.getcwd()
print sys.path
assert 1==0
您会注意到“from cyan.lib import”行。它应该是“从库导入”,但这不起作用
从测试结果来看,它不起作用的原因很清楚:
/Users/brianp/work/cyan
['/Users/brianp/work', .........]
那个。。。。和预期一样,都是标准的图书馆venv材料
从正常python运行打印sys.path时,我得到:
['', .........]
这似乎是对的
因此,不知何故,当我运行pytest时,在青色目录中,父目录进入pythonpath而不是当前目录
我在所有适当的目录中都有\uuuu init\uuuu.py
增加:
好的,感谢@timchap的评论,我学到了一些东西:
Tim发布的文档暗示在我的青色目录中有一个pytest.ini应该是rootdir。那不行
似乎发生的是,它从tests目录开始,并在路径中查找,直到找到一个没有\uuu init\uuu.py
的目录。因为我的根目录有一个,所以它一直向上,直到父目录
也许这就是问题的全部?我的根目录有\uuu init\uuuu.py
?这似乎是一个奇怪的假设…提供了一些关于如何确定pytest运行的根目录的信息。这似乎不能完全解释您的观察结果,但它确实提供了一些关于根目录确定应该如何工作的见解
经过一些思考,我认为您观察到的行为是有意义的——pytest似乎试图将当前包的父目录添加到路径中,以便为当前包使用绝对导入的模块能够正常工作
为了避免将来的这种歧义,您可以考虑在测试模块中使用相对导入。
向@ TimCHAP的答案添加细节: Rootdir的计算方法与他发布的链接中所说的完全一致 但是,rootdir不是用来确定pythonpath(sys.path)的 通常情况下,当您运行python时,它会将“”(或“.”)添加到pythonpath,以便导入当前目录中的内容,pytest会尝试执行更复杂的操作pytest从(我相信)test目录中查找,并一直查找,直到找到一个没有
\uuu init\uuu.py
的目录。如果项目的根目录由于任何原因恰好有\uuuu init\uuuuu.py
,那么它将走得太高,并且可能所有本地导入(除非它们是相对的)都将失败。提供了有关如何确定pytest运行的根目录的一些信息。根据您的描述,当前工作目录似乎确实应该是根目录。您的树中是否有ini文件或setup.py?我没有ini或setup.py。不过我有一个init.py。。。我将查看创建ini是否有帮助。添加pytest.ini并没有帮助刚刚测试过,我可以确认相同的行为-pytest似乎会向上遍历,直到找到一个没有init的目录。py@BrianPostow取消删除并更新了我的答案。事实证明,这就是如何使用pytest.ini或其他方法计算“rootdir”。然而,由于某些原因,rootdir并不是放入pythonpath的内容。。。