Pytest corriendo con otra versión de python

He instalado pyenv y he instalado diferentes versiones de python:

 $ pyenv versions system 2.7.1 3.2.5 3.5.0 3.5.1 * 3.5.2 

Utilizo el siguiente comando para cambiar a python 3.5.2 :

Pyenv Shell 3.5.2

Y cuando reviso la versión de python, esto es lo que obtengo:

 $ python --version Python 3.5.2 

Pero cuando ejecuto pytest , todavía se ejecuta bajo python 2.7.6 :

pytest -v
================================================== ================== la sesión de prueba comienza ============================= ========================================
plataforma linux2 – Python 2.7.6, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 – / usr / bin / python

¿Por qué se ejecuta pytest en la versión anterior?

En pocas palabras: ejecutar

  • python -m pytest , o
  • py.test- si su Python y pytest alternativos están instalados con el administrador de paquetes del sistema, o
  • Si su Python alternativo ha sido instalado con pyenv , cambie con pyenv a esa versión y asegúrese de tener pytest instalado para él. Entonces puedes simplemente correr pytest .
    • Ya que el ejecutable pip también se encuentra entre los que se están cambiando, debe cambiar al Python alternativo antes de instalar pytest para él también.

Como puedo ver, /usr/bin/pytest (que pertenece al paquete python-pytest paquetes del sistema) tiene un shebang !#/usr/bin/python ya que corresponde a la instalación del python del sistema.

pyenv , como dice su README.md , no reemplaza /usr/bin/python , porque de hecho no debería ser reemplazado para evitar romper los paquetes del sistema .

En su lugar, agrega su directorio a PATH e inserta un lanzador allí (llamado ” shim “) que es lo que se invoca cuando se escribe ” python “. Como probablemente adivinaste, este hack es ignorado por un shebang como el anterior, como debería ser.

  • La ejecución de python -m pytest hará que cualquier python que se python -m pytest utilice el paquete desde su instalación.
  • Alternativamente, pytest para su otra versión de Python puede incluir ejecutables versionados en la PATH llamada py.test- (por ejemplo, py.test-3 o py.test-3.6 ) dependiendo de la forma en que lo instaló.
    • Si se trata de un paquete de administrador de paquetes del sistema para python no estándar, como python36-pytest , esto está virtualmente garantizado.
    • Verifiqué que si instala una versión con pip , solo crea un ejecutable no versionado (aunque usted también puede crear uno versionado). Además, si instala el mismo paquete para una versión diferente de Python pero con el mismo --prefix , se sobrescribirá el ejecutable existente.
  • La forma sugerida de pyenv parece ser instalar todas las versiones de interés y paquetes de python para ellos en ~/.pyenv/versions .
    • Esto no es aplicable para el sistema Python, pero se puede usar el valor predeterminado /usr/local .
    • Una vez que se cambia a una versión de Python alternativa, se dice que crea shims para todos los scripts (¡incluyendo pip !) Que están instalados actualmente para esa versión , por lo que invocar esos scripts sin una ruta ejecutaría esos shims.
      • Por lo tanto, si un paquete (y, por lo tanto, su secuencia de comandos) no se instala para la versión alternativa, sino que se instala para la versión del sistema, intentar ejecutar su ejecutable “caerá” a /usr/local con el resultado que está viendo ahora.

Busco en internet y encuentro la pregunta relacionada . Ese tipo trabaja de la siguiente manera:

 python -m pytest tests/my_test.py 

Por favor, dime si eso funciona o no 🙂