python flask python-import py.test

python - Comando "py.test" vs "pytest"



flask python-import (2)

El comando py.test está fallando en mi caso, mientras que pytest está ejecutando totalmente bien.

Yo uso el plugin 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

Cuando invoco $ py.test obtengo el siguiente error:

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

Este es mi archivo conftest.py real:

import pytest from app.app import create_app @pytest.fixture def app(): app = create_app() return app

La estructura de mi proyecto es como:

. ├── app │ ├── __init__.py │ ├── app.py │ └── config.py # flask configuration objects ├── conftest.py # pytest configruation ├── requirements.txt ├── ... └── tests └── ...

Entonces, ¿cuál es la diferencia entre los dos comandos? ¿Y por qué uno falla y el otro no?

actualización 1

1) Tuve que cambiar mis importaciones relativas from .config import Config o from config import Config a from app.config import Config absolutos como from app.config import Config

2) Matraz de funcionamiento con python3 -m app.app

3) ahora pytest y py.test funcionan normalmente

Muchas gracias por su ayuda, amigos!

actualización 2

Esto se está volviendo raro ... cuando se usan importaciones absolutas, ejecutando python con la opción -m y matraz con debug=True entonces la biblioteca werkzeug no está recargando las fuentes como se esperaba:

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

Esto me ayudó en mi app/app.py :

if __name__ == ''__main__'': app.run(debug=True, use_reloader=False)

Entonces python -m app.app funciona bien.


Para responder a la pregunta sobre el comando real (es decir, la invocación de la herramienta en la línea de comandos) con un poco más de detalle:

La invocación py.test es la articulación antigua y rota. pytest es el nuevo hotness (desde 3.0). py.test invocaciones py.test y pytest coexistirán durante mucho tiempo, supongo, pero en algún momento py.test puede estar obsoleto. Así que lo recomendaría a #dropthedot .

[...] desde pytest 3.0 admitiremos y recomendaremos el uso de pytest como comando principal en lugar de py.test. Es posible que en el futuro desechemos py.test y, posiblemente, lo eliminemos.

- Dave Hunt

La compatibilidad con versiones anteriores es una preocupación muy importante para la comunidad pytest, por lo que la forma antigua nunca desaparecerá y no será una carga de mantenimiento mantenerla de todos modos (solo se define como un punto de entrada diferente en setup.py ).


Use pytest ... o incluso mejor python -m pytest ...

Puedes olvidarte del nombre antiguo, es claramente un error si aún lo encuentras en algún lugar.