Umgebung
Beschreibung
Während ich an diesem # 7810 arbeitete, stellte ich fest, dass bei Verwendung von script.pip("freeze")
mit use_module
als True
was das Standardverhalten ist, keine Paketliste angezeigt wird Wenn ich use_module
explizit als False
spezifiziere, ist dies der Fall.
Ich habe festgestellt, dass der Unterschied in der Art und Weise liegt, wie der Befehl aufgerufen wird. Mit use_module=True
wird es als python -m pip freeze
und mit use_module=False
als pip freeze
aufgerufen.
Erwartetes Verhalten
In beiden Fällen sollte die Paketliste angezeigt werden.
Wie zu reproduzieren
Ein Test kann geschrieben werden, um dieses Verhalten zu überprüfen.
def test_pip_script(script):
assert script.pip("freeze").stdout == script.pip("freeze", use_module=False).stdout
Ausgabe
___________________________________________________ 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
Vielen Dank, dass Sie eine neue Ausgabe dafür eingereicht haben!
Meine erste Antwort ist hier: https://github.com/pypa/pip/pull/7810#issuecomment-599191853. Bitte folgen Sie dem hier. :) :)
Wie Sie vorgeschlagen haben, habe ich hier https://github.com/pypa/pip/pull/7810#issuecomment -599191853 den Test geschrieben. Es schlägt jedoch mit folgendem Standard fehl
====================================================== 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. Das macht Sinn - wer use_module implementiert hat, hat die Nuancen hier nicht berücksichtigt. :) :)
pip
in der PipTestEnvironment PATH
ist nicht das richtige zu testende Element. Ich bin nicht sicher, was das Update TBH ist; Vielleicht den vollständigen absoluten Pfad zu einer ausführbaren Datei erhalten, wenn use_module = False verwendet wird?
Ist es diese Zeile hier https://github.com/pypa/pip/blob/master/tests/lib/__init__.py#L475 , in der die PATH
für die Testumgebung festgelegt werden?
Sollte ja sein. Es könnte sich auch in der Isolatvorrichtung befinden, so dass es sich lohnt, einen Blick darauf zu werfen.
Ich habe herausgefunden, dass dies daran liegt, dass wir keine ausführbare Pip-Datei im Ordner Scripts
der virtuellen Umgebung haben.
So können wir python [...]/src/pip
unter https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/lib/__init__.py#L619 ausführen
[...]/src/pip
den in https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L285 definierten absoluten Pfad
Ich bin mir nicht sicher, ob das richtig ist. Dies kann jedoch den Fehler beheben.
In https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L294 werden alle Dateien in venv.bin
(dem Skriptordner) entfernt, mit Ausnahme derjenigen, die mit "python" beginnen. oder "libpy", was bedeutet nicht verlagerbar?