【发布时间】:2017-01-22 13:18:16
【问题描述】:
在我的情况下,py.test 命令失败,而 pytest 运行完全正常。
我使用 pytest-flask 插件:
platform linux -- Python 3.5.2, pytest-3.0.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/sebastian/develop/py/flask-rest-template, inifile:
plugins: flask-0.10.0
当我调用 $ py.test 时,我收到以下错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/_pytest/config.py", line 301, in _getconftestmodules
return self._path2confmods[path]
KeyError: local('/home/sebastian/develop/py/flask-rest-template')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/_pytest/config.py", line 332, in _importconftest
return self._conftestpath2mod[conftestpath]
KeyError: local('/home/sebastian/develop/py/flask-rest-template/conftest.py')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/_pytest/config.py", line 338, in _importconftest
mod = conftestpath.pyimport()
File "/usr/local/lib/python3.5/dist-packages/py/_path/local.py", line 650, in pyimport
__import__(modname)
File "/usr/local/lib/python3.5/dist-packages/_pytest/assertion/rewrite.py", line 207, in load_module
py.builtin.exec_(co, mod.__dict__)
File "/home/sebastian/develop/py/flask-rest-template/conftest.py", line 2, in <module>
from app.app import create_app
File "/home/sebastian/develop/py/flask-rest-template/app/app.py", line 1, in <module>
from flask import Flask
ImportError: No module named 'flask'
ERROR: could not load /home/sebastian/develop/py/flask-rest-template/conftest.py
这是我的实际conftest.py 文件:
import pytest
from app.app import create_app
@pytest.fixture
def app():
app = create_app()
return app
我的项目结构如下:
.
├── app
│ ├── __init__.py
│ ├── app.py
│ └── config.py # flask configuration objects
├── conftest.py # pytest configruation
├── requirements.txt
├── ...
└── tests
└── ...
那么,这两个命令有什么区别呢?为什么一个失败而另一个没有?
更新 1
1) 我必须将我的相对导入 from .config import Config 或 from config import Config 更改为绝对导入,例如 from app.config import Config
2) 使用 python3 -m app.app 运行烧瓶
3) 现在pytest 和py.test 工作正常
非常感谢你们的帮助,伙计们!
更新 2
这越来越奇怪了...当使用绝对导入时,使用 -m 选项运行 python 并使用 debug=True 运行烧瓶,然后 werkzeug 库不会按预期重新加载源:
http://chase-seibert.github.io/blog/2015/06/12/flask-werkzeug-reloader-python-dash-m.html
https://github.com/pallets/werkzeug/issues/461
https://github.com/pallets/flask/issues/1246
这对我的app/app.py 有帮助:
if __name__ == '__main__':
app.run(debug=True, use_reloader=False)
然后python -m app.app 工作正常。
【问题讨论】:
-
pytest命令是 new 方式,你可能有一个旧版本的 pytest。 -
感谢您的提示!所以以后我只会用
pytest... -
which pytest和which py.test怎么说? -
/usr/local/bin/py.test和/usr/local/bin/pytest。当我像sudo pip3 install pytest一样安装时,两者都带有pytest-3.0.2-py2.py3-none-any.whl。 -
哈!它是关于相对进口的......当我做
from .config import Config然后pytest运行良好。但是当像from config import Config这样导入时,它会失败......
标签: python flask python-import pytest