Pip: script.pip()不适用于use_module = True

创建于 2020-03-15  ·  6评论  ·  资料来源: pypa/pip

环境

  • 点子版本:20.1.dev0
  • Python版本:3.6.9
  • 操作系统:Linux Mint Debian Edition

描述

在研究此#7810时,我发现当我将script.pip("freeze")use_module用作True这是默认行为)时,它不会显示任何程序包列表,而当我将use_module明确指定为False ,它会执行。

我发现区别在于调用命令的方式。 对于use_module=True ,它将作为python -m pip freeze调用,对于use_module=False ,它将作为pip freeze调用。

预期行为

两种方式都应该显示软件包列表。

如何繁殖

可以编写一个测试来验证此行为。

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

输出

___________________________________________________ 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

所有6条评论

感谢您为此提交新的期刊!

我的最初回应是在这里:https://github.com/pypa/pip/pull/7810#issuecomment-599191853。 请在此继续跟进。 :)

如您所建议,在这里https://github.com/pypa/pip/pull/7810#issuecomment -599191853,我已经编写了测试。 但是,它失败并出现以下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)

啊这是有道理的-谁实现了use_module都没有考虑到这里的细微差别。 :)

PipTestEnvironment PATH pip中的

这行是否在这里https://github.com/pypa/pip/blob/master/tests/lib/__init__.py#L475设置了测试环境的PATH

应该是的。 它也可能在隔离装置中,因此值得一看。

我发现这是因为在虚拟环境的Scripts文件夹中没有pip可执行文件。
因此我们可以在https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/lib/__init__.py#L619执行python [...]/src/pip
[...]/src/pip表示在https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L285中定义的绝对路径
我不确定这是正确的。 但这可以修复该错误。
https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L294中,它会删除venv.bin (这是Scripts文件夹)中的所有文件,但以“ python”开头的文件除外或“ libpy”,不可重定位是什么意思?

此页面是否有帮助?
0 / 5 - 0 等级