Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从父目录运行的Pytest?_Python_Pytest - Fatal编程技术网

Python 从父目录运行的Pytest?

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

我开始使用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
    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的内容。。。