Pip: script.pip () não funciona com use_module = True

Criado em 15 mar. 2020  ·  6Comentários  ·  Fonte: pypa/pip

Meio Ambiente

  • versão pip: 20.1.dev0
  • Versão Python: 3.6.9
  • SO: Linux Mint Debian Edition

Descrição

Enquanto estava trabalhando neste # 7810, descobri que quando uso script.pip("freeze") com use_module como True que é o comportamento padrão, ele não mostra nenhuma lista de pacotes, embora quando eu especifico explicitamente use_module como False , isso acontece.

Descobri que a diferença é a maneira como o comando é invocado. Com use_module=True , é invocado como python -m pip freeze e com use_module=False , é invocado como pip freeze .

Comportamento esperado

Em ambas as formas, ele deve mostrar a lista de pacotes.

Como reproduzir

Um teste pode ser escrito para verificar esse comportamento.

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

Resultado

___________________________________________________ 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 comentários

Obrigado por preencher um novo problema para isso!

Minha resposta inicial está aqui: https://github.com/pypa/pip/pull/7810#issuecomment-599191853. Acompanhe isso aqui. :)

Como você sugeriu, aqui https://github.com/pypa/pip/pull/7810#issuecomment -599191853, escrevi o teste. No entanto, ele falha com o seguinte 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. Isso faz sentido - quem implementou use_module não levou em consideração as nuances aqui. :)

pip no PipTestEnvironment PATH não é o item correto a ser testado. Não tenho certeza de qual é a correção TBH; talvez obter o caminho absoluto completo para um executável, ao usar use_module = False?

É esta linha aqui https://github.com/pypa/pip/blob/master/tests/lib/__init__.py#L475 , onde o PATH para o ambiente de teste está sendo definido?

Deveria ser, sim. Também pode estar no acessório isolado, então vale a pena dar uma olhada.

Descobri que isso ocorre porque não temos o arquivo executável pip na pasta Scripts do ambiente virtual.
Portanto, podemos executar python [...]/src/pip em https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/lib/__init__.py#L619
[...]/src/pip significa o caminho absolote definido em https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L285
Não tenho certeza se isso está correto. Mas isso pode corrigir o bug.
E em https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L294 ele remove todos os arquivos em venv.bin (que é a pasta Scripts), exceto aqueles que começam com "python" ou "libpy", o que significa não realocável?

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

nijel picture nijel  ·  79Comentários

pradyunsg picture pradyunsg  ·  101Comentários

qwcode picture qwcode  ·  89Comentários

dstufft picture dstufft  ·  170Comentários

jeanlaroche picture jeanlaroche  ·  89Comentários