Python pytest找不到模块

Python pytest找不到模块,python,python-3.x,pytest,Python,Python 3.x,Pytest,我在遵循这个原则,或者至少我认为我是这样。但是,pytest找不到我的模块。它似乎没有在其PYTHONPATH中包含当前目录 源文件: def add(x, y): return x + y 测试文件: import pytest from junk.ook import add def test_add_true(): assert add(1, 1) == 2 以及一个名为“p3”的Python3虚拟环境的shell输出 我做错了什么?只需将添加到tests目录中,并

我在遵循这个原则,或者至少我认为我是这样。但是,pytest找不到我的模块。它似乎没有在其
PYTHONPATH
中包含当前目录

源文件:

def add(x, y):
    return x + y
测试文件:

import pytest
from junk.ook import add


def test_add_true():
    assert add(1, 1) == 2
以及一个名为“p3”的Python3虚拟环境的shell输出


我做错了什么?

只需将
添加到
tests
目录中,并递归添加到其中包含测试文件的所有目录中。

只需在项目根目录中放置一个空的
conftest.py
文件:

$ pwd
/home/usr/tmp/junk
$ touch conftest.py
您的项目结构应为:

junk
├── conftest.py
├── junk
│   ├── __init__.py
│   └── ook.py
└── tests
    └── test_ook.py

这里会发生什么:当
pytest
发现
conftest.py
时,它会修改
sys.path
,以便从conftest模块导入内容。因此,由于现在在rootdir中找到了一个空的
conftest.py
pytest
将被迫将其附加到
sys.path
。这样做的副作用是,您的
垃圾
模块变得可导入。

如果您将
\uuuu init\uuuuuuuuuuuupy
添加到tests文件夹中,它是否也有帮助?在tests目录中添加
\uuuuuuu init\uuuuuuuuuuuuuupy
确实有帮助。它应该在没有
\uuuu init\uuuu.py
文件的情况下工作。它会带来什么问题?您链接的文章将
\uuuu init\uuuuu.py
放在
tests
目录中,并递归地将所有目录(包括测试)放在其中。但现在这引入了一个微妙的问题:为了从tests目录加载测试模块,pytest将存储库的根预先添加到sys.path,这增加了一个副作用,即现在mypkg也很重要。如果您在虚拟环境中使用tox之类的工具来测试软件包,这是有问题的,因为您要测试的是软件包的已安装版本,而不是存储库中的本地代码。您必须将软件包安装到virtualenv中。至少我每次都是这样摆脱这个错误的。但现在这引入了一个微妙的问题:为了从tests目录加载测试模块,pytest将存储库的根预先添加到sys.path,这增加了一个副作用,即现在mypkg也是可导入的。如果您在虚拟环境中使用tox之类的工具测试软件包,则会出现问题,因为您希望测试的是软件包的已安装版本,而不是存储库中的本地代码。只有测试已安装版本对您很重要时,这才是问题。如果你在打包方面没有做任何奇怪的事情,那么大多数时候都不会有什么不同。我很担心为什么
pytest
不起作用,而
python-m pytest
起作用。谢谢。@KiranKumarKotari谢谢你!这解决了我在docker.python中遇到的一个问题-m为您执行导入,然后作为脚本运行该文件,因此它解决了相对导入问题该死!诅咒你的阅读障碍!!!谢谢你的耐心,不用担心!顺便说一句,检查链接问题中的答案,建议在可编辑模式下安装软件包可能是比滥用
pytest
测试发现机制更可行的解决方案。我已经尝试过这个解决方案,但它似乎不再起作用了。。。Python 3.7,pytest版本6.2.1。但是,运行
python3.7-m pytest
而不仅仅是
pytest
works@Expanding-Dev adding
conftest.py
继续使用6.2.1,您的项目布局必须有另一个问题。如果您愿意,请在这里的评论中提出一个单独的问题并ping我。谢谢!添加
conftest.py
与pytest 6.2.4配合使用。
$ pwd
/home/usr/tmp/junk
$ touch conftest.py
junk
├── conftest.py
├── junk
│   ├── __init__.py
│   └── ook.py
└── tests
    └── test_ook.py