venv与virtualenv - 为什么venv不使用当前的pip和setuptools?

8
使用python -m venv env在Python3.X中创建新的虚拟环境时,env中不含我期望的pipsetuptools版本。相反,它包含相当“旧”的版本:pip (8.1.1)setuptools (20.7.0),截至2018年6月。
另一方面,使用virtualenv env(通过pip install virtualenv安装)时,pipsetuptools包是最新可用的,即pip (10.0.1)setuptools (39.2.0),截至2018年6月。
据我所理解,venv是构建虚拟环境的首选模块,因为它不需要创建Python解释器的新实例,并且在不需要安装任何内容的情况下使用当前模块(在Linux中是符号链接,在Windows中是副本)。 (https://www.reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv/d2s2cda)
那么,venvpip版本为什么与当前系统的版本不匹配?而使用virtualenv的行为又如此不同?
PS:
短期解决方案是在env中使用pip install --upgrade pip。但这对我来说似乎不合适。最小可行解决方案:
$ python --version
Python 3.6.5
$ pip --version
pip 10.0.1 from /home/lionel/.local/lib/python3.6/site-packages/pip (python 3.6)
$ python -m venv env
$ . env/bin/activate
(env) $ # Here I am at version 8.1.1 of pip. Why did venv create its own pip,
(env) $ # instead of linking to the system one? As seen before, that was 10.0.1.
(env) $ pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Uninstalling pip-8.1.1:
      Successfully uninstalled pip-8.1.1
Successfully installed pip-10.0.1
(env) $ pip list
Package       Version
------------- -------
pip           10.0.1 
pkg-resources 0.0.0  
setuptools    20.7.0 
(env) $ # Solved, now pip is the one I was expecting!

你的“Python”版本是3.6,但你的pip版本却与3.5关联。看起来你已经在某种程度上搞砸了你的环境。对于3.6版本,供应商提供的pip和setuptools通常分别为9.0.1 / 28.8.0(但这取决于谁编译了Python)。 - wim
嘘!停止使用 venv,使用 pipenv。过后感谢我。 - ramazan polat
你好,Wim和Ramazan!感谢你们的回答!@wim:确实,pip已经连接到3.5。我明白我的问题解决方案在于我在Ubuntu上安装了python3.5和python3.6。问题出现是因为当我使用“venv”时,pip要求更新(“您正在使用pip版本8.1.1,但版本10.0.0可用。”),而在使用“virtualenv”时它没有要求更新,因为pip已经是最新版本。感谢wim展示了问题所在。 - Lionel Trebuchon
通过卸载pip解决: ** python -m pip uninstall pip ** 我将尝试忽略未来的警告“您正在使用pip版本8.1.1,但版本10.0.0可用。您应该考虑通过'pip install --upgrade pip'命令进行升级。” - Lionel Trebuchon
当pip正确连接到Python时(请参见我的问题中的编辑),问题仍然存在:1.在venv之前,我有适用于Python 3.6的pip(10.0.1),在venv之后,我有适用于Python 3.6 /的pip(8.1.1) - Lionel Trebuchon
1个回答

4

不想重启旧的线程,但我找到了为什么在使用venv时会发生这种情况的答案-简短回答-

venv调用ensurepip.version()获取版本- 这将获得捆绑的pip版本。

原始答案来自这里:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接