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
有助于解决这个问题。
由于您当前的包尚未在您的 $PYTHONPATH
或 sys.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 pytest
或 python -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 没有名为 * 的模块的主要内容,如果未能解决你的问题,请参考以下文章