Py.test 没有名为 * 的模块

Posted

技术标签:

【中文标题】Py.test 没有名为 * 的模块【英文标题】:Py.test No module named * 【发布时间】:2014-01-25 22:25:09 【问题描述】:

我有这样的文件夹结构

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

在我的test_app.py file 中,我有一行来导入我的应用程序模块。当我在根文件夹上运行 py.test 时,我收到关于没有名为 app 的模块的错误。我应该如何配置?

【问题讨论】:

PATH issue with pytest 'ImportError: No module named YadaYadaYada'的可能重复 【参考方案1】:

这对我有用: 转到父应用,然后pip install -e .(安装本地和可编辑的应用)。

【讨论】:

【参考方案2】:

使用python -m pytest 命令运行pytest 有助于解决这个问题。

由于您当前的包尚未在您的 $PYTHONPATHsys.path 中 - pytest 收到此错误。

通过使用python -m pytest,您会自动将工作目录添加到sys.path 以运行pytest。他们的文档还提到:

这几乎等同于调用命令行脚本pytest

【讨论】:

【参考方案3】:

在为我的应用程序运行测试用例时,我也遇到了同样的错误

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__

我删除了我的 myproject 的 init.py 文件来运行我的测试用例。

【讨论】:

在 Pycharm 中为我工作【参考方案4】:

我遇到了类似的问题。在尝试了多种方法(包括在虚拟环境中安装 pytest 以及从包中添加/删除 __init__.py 文件)后,没有一个对我有用。

对我有用的解决方案是(Windows 解决方案): 将项目文件夹(不是包文件夹)添加到 python 路径(设置 PYTHONPATH=%PYTHONPATH%;%CD%)

从项目文件夹中运行我的脚本,然后就成功了。

【讨论】:

【参考方案5】:

我遇到了类似的问题,不得不从根目录中删除__init__.py,并将__init__.py 添加到tests 文件夹中。

【讨论】:

我遇到了同样的问题,需要从根目录中删除 init。有谁知道为什么 root 中的 init 会对 pytest 造成严重破坏? 我只是在测试中缺少 init.py,谢谢!【参考方案6】:

使用 Python 3 并在类似的项目布局中遇到相同的错误,我通过将 __init__ 文件添加到我的 tests 模块来解决它。

$ touch tests/__init__.py

我不擅长打包和导入,但我认为这有助于pytest 找出目标App 模块所在的位置。

【讨论】:

在使用此策略之前,您应该检查 pytest 最佳实践的含义:docs.pytest.org/en/latest/… 这是我让它在 Python 3 中工作的唯一方法。 @jamesc 我正在遵循他们的“外部应用程序代码”模式的“最佳实践”,如果我执行 coverage run -m pytestpython -m pytest 它可以工作,但如果我直接运行 pytest 失败,则失败加载模块错误。 @TheIncorrigible1 真的很高兴在这里看到您的评论,因为我被难住了一会儿。我不确定这是否是同一个问题,但我在 GitHub 上发表了评论:github.com/pytest-dev/pytest/issues/6370#issuecomment-575423003 @blong 我已经解决了我遇到的问题,方法是将我的源代码作为一个包安装到虚拟环境中,这需要深入研究 python 打包和 distutils/setuptools。【参考方案7】:

我已经在/App/App 目录中有一个__init__.py 文件,并且想从项目根目录运行测试,而不需要任何路径修改魔法:

 python -m pytest tests

输出立即如下所示:

➟  python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile: 
plugins: teamcity-messages-1.17
collected 46 items 

... lines omitted ...

============================= 44 passed, 2 skipped in 1.61 seconds ==============================

【讨论】:

你能弄清楚为什么直接启动py.test没有发现/App/App的原因吗? 好吧,python 确实将当前目录添加到了 pythonpath,所以你仍在使用路径修改魔法,顺便说一句,这就是它起作用的原因! python -m pytest tests 拯救了我的一天【参考方案8】:

所以你从/App 运行py.test。你确定/App/App 在你的$PYTHONPATH 中吗?

如果不是,尝试import app 的代码将失败并显示这样的消息。

EDIT0: 包括我下面评论中的信息,以确保完整性。

只有在/App/App 内执行导入应用程序的尝试才会成功,这里不是这种情况。您可能希望通过将__init__.py 放入其中来制作/App/App 一个包,并将您的导入更改为将应用程序限定为from App import app

EDIT1: 应要求,在下面的第二条评论中添加进一步的解释。

通过将__init__.py 放入/App/App,该目录就变成了一个包。这意味着您可以从中导入,只要它 - 目录 - 在 $PYTHONPATH 中可见。 IE。如果/App$PYTHONPATH 中,你可以从App import app 开始。您当前的工作目录会自动添加到 $PYTHONPATH,因此当您从 /App 运行脚本时,导入将起作用。

【讨论】:

我已经在/App 上运行了pip install -e .,所以这个包被安装到了/usr/local 库中。我认为这会将我的文件夹添加到路径中? /App/App 没有理由自动添加到$PYTHONPATH 中,无论您将pip 安装在何处。对import app 的尝试只有在inside /App/App 执行时才会成功,这里的情况并非如此。您可能希望通过将__init__.py 放入其中来制作/App/App 一个包,并将您的导入更改为将app 限定为from App import app 我的测试现在可以运行了。我仍然对 $PYTHONPATH 部分感到困惑。是不是如果我把 init.py 添加到我的/App/App 文件夹中,python 会自动将/App/App 文件夹插入到路径中? @zsljulius:通过将__init__.py 放入/App/App,该目录就变成了一个包。这意味着您可以从中导入,只要它 - 目录 - 在 $PYTHONPATH 中可见。 IE。如果/App$PYTHONPATH 中,您可以执行from App import app。您当前的工作目录会自动添加到 $PYTHONPATH,因此当您从 /App 运行脚本时,导入将起作用。

以上是关于Py.test 没有名为 * 的模块的主要内容,如果未能解决你的问题,请参考以下文章

Python:'ImportError:没有命名模块 “

python 模块与包

成功运行 py.test 后模块“线程”中的 KeyError

pytest_用例运行级别_模块级

为啥 PyCharm 无法运行单元测试?

Python全栈之路----常用模块----sys模块