Ambiente
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
¡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?