Pip: script.pip () no funciona con use_module = True

Creado en 15 mar. 2020  ·  6Comentarios  ·  Fuente: pypa/pip

Ambiente

  • versión pip: 20.1.dev0
  • Versión de Python: 3.6.9
  • SO: Linux Mint Debian Edition

Descripción

Mientras trabajaba en este # 7810, descubrí que cuando uso script.pip("freeze") con use_module como True que es el comportamiento predeterminado, no muestra ninguna lista de paquetes, mientras cuando especifico explícitamente use_module como False , lo hace.

Descubrí que la diferencia es la forma en que se invoca el comando. Con use_module=True , se invoca como python -m pip freeze y con use_module=False , se invoca como pip freeze .

Comportamiento esperado

En ambos sentidos, debería aparecer la lista de paquetes.

Cómo reproducir

Se puede escribir una prueba para verificar este comportamiento.

def test_pip_script(script):
    assert script.pip("freeze").stdout == script.pip("freeze", use_module=False).stdout

Producción

___________________________________________________ test_pip_script ___________________________________________________
[gw4] linux -- Python 3.6.9 /home/gutsytechster/Documents/Projects/Open-Source-Projects/pip/.tox/py36/bin/python

script = <tests.lib.PipTestEnvironment object at 0x7f696adfc8d0>

    def test_pip_script(script):
>       assert script.pip("freeze").stdout == script.pip("freeze", use_module=False).stdout
E       AssertionError: assert '' == 'apipkg==1.5\natomicwrites==...zeug==0.16.0\nzipp==3.0.0\n'
E         + apipkg==1.5
E         + atomicwrites==1.3.0
E         + attrs==19.3.0
E         + cffi==1.14.0
E         + coverage==5.0.3
E         + cryptography==2.8
E         + csv23==0.1.6
E         + execnet==1.7.1
E         + freezegun==0.3.15
E         + importlib-metadata==1.5.0
E         + mock==4.0.1
E         + more-itertools==8.2.0
E         + pluggy==0.13.1
E         + pretend==1.0.9
E         + py==1.8.1
E         + pycparser==2.19
E         + pytest==3.8.2
E         + pytest-cov==2.8.1
E         + pytest-forked==1.1.3
E         + pytest-rerunfailures==6.0
E         + pytest-timeout==1.3.4
E         + pytest-xdist==1.27.0
E         + python-dateutil==2.8.1
E         + PyYAML==5.3
E         + scripttest==1.3
E         + six==1.14.0
E         + virtualenv==16.7.10
E         + Werkzeug==0.16.0
E         + zipp==3.0.0
tests bug maintenance

Todos 6 comentarios

¡Gracias por presentar un nuevo problema para esto!

Mi respuesta inicial está aquí: https://github.com/pypa/pip/pull/7810#issuecomment-599191853. Por favor, haga un seguimiento de eso aquí. :)

Como sugirió, aquí https://github.com/pypa/pip/pull/7810#issuecomment -599191853, he escrito la prueba. Sin embargo, falla al seguir stdout

====================================================== FAILURES =======================================================
___________________________________________________ test_pip_script ___________________________________________________
[gw3] linux -- Python 3.6.9 /home/gutsytechster/Documents/Projects/Open-Source-Projects/pip/.tox/py36/bin/python

script = <tests.lib.PipTestEnvironment object at 0x7fc79f3b5208>

    def test_pip_script(script):
        r1 = script.pip("--version")
        r2 = script.pip("--version", use_module=False)
>       assert r1.stdout == r2.stdout
E       AssertionError: assert 'pip 20.1.dev...python 3.6)\n' == 'pip 20.1.dev0...python 3.6)\n'
E         - pip 20.1.dev0 from /tmp/pytest-of-gutsytechster/pytest-0/popen-gw3/pip0/pip/src/pip (python 3.6)
E         + pip 20.1.dev0 from /home/gutsytechster/Documents/Projects/Open-Source-Projects/pip/.tox/py36/lib/python3.6/site-packages/pip (python 3.6)

Ahhhh. Eso tiene sentido: quien haya implementado use_module no tuvo en cuenta los matices aquí. :)

pip en PipTestEnvironment PATH no es el elemento correcto para ser probado. No estoy seguro de cuál es la solución TBH; tal vez obteniendo la ruta absoluta completa a un ejecutable, cuando se usa use_module = False?

¿Es esta línea aquí https://github.com/pypa/pip/blob/master/tests/lib/__init__.py#L475 , donde se establece el PATH para el entorno de prueba?

Debería ser, sí. También podría estar en el accesorio aislado, por lo que valdría la pena echarle un vistazo.

Descubrí que esto se debe a que no tenemos un archivo ejecutable pip en la carpeta Scripts del entorno virtual.
Entonces podemos ejecutar python [...]/src/pip en https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/lib/__init__.py#L619
[...]/src/pip significa la ruta absoluta definida en https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L285
No estoy seguro de que esto sea correcto. Pero esto puede solucionar el error.
Y en https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L294 elimina todos los archivos en venv.bin (que es la carpeta Scripts) excepto los que comienzan con "python" o "libpy", ¿qué significa no reubicable?

¿Fue útil esta página
0 / 5 - 0 calificaciones