为什么 Python 的 pip 在每个新的虚拟环境中都会重置为 10.0.1 版?

mas*_*mas 3 arch-linux pacman python package-management pip

tl;dr:为什么每次我创建一个新的虚拟环境时 pip 的版本都会重置为 10.0.1,而不是从我的全局 18.0 安装中自动克隆?

每次我创建一个新的虚拟环境时,我都会被告知我的pip已经过时了。我跑

$ pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

并得到以下输出:

Collecting pip
  Using cached https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-18.0
Run Code Online (Sandbox Code Playgroud)

pip -V在虚拟环境之外运行返回

pip 18.0 from /usr/lib/python3.7/site-packages/pip (python 3.7)
Run Code Online (Sandbox Code Playgroud)

所以过时的版本只有在我创建一个新的虚拟环境时才会创建。

这是python的虚拟环境模块的一个特性吗?

作为记录,我运行以创建新的虚拟环境的命令是:

$ python -m venv <venv>
Run Code Online (Sandbox Code Playgroud)

我通过运行安装它

$ pacman -S python python-pip
Run Code Online (Sandbox Code Playgroud)

我在 Arch 中运行它,输出python -VPython 3.7.0.

hoe*_*ing 6

pip创建新的虚拟环境时不会重置。当你创建一个新的虚拟环境中,venv执行新的安装pip,并setuptools在这样的环境。哪里的pip版本从何而来?当您运行 时python -m venv, 的安装pipensurepip引导新pip安装的模块的责任。您可以检查pip与 Python 3.7 捆绑的版本:

$ python3 -c "import ensurepip; print(ensurepip.version())"
10.0.1
Run Code Online (Sandbox Code Playgroud)

这是您无法自行更新或修改的内容;该模块是标准库的一部分。当 Python 3.7 发布时,最新pip版本是 10.0.1,所以它被捆绑(相关问题)。版本 18 稍后发布。下一次,它可能会在下一个 Python 版本(3.7.1)中更新。

替代方案:使用 virtualenv

如果您希望pip在全新的虚拟环境中安装最新版本,您可以切换到virtualenv

$ pip install --user virtualenv
Run Code Online (Sandbox Code Playgroud)

或使用pacman以下方法安装系统范围:

$ pacman -S python-virtualenv
Run Code Online (Sandbox Code Playgroud)

virtualenv比 Python 更新更频繁,所以最新版本安装最新的包。用法示例:

$ virtualenv myenv --python=python3 --quiet
$ source myenv/bin/activate
(myenv) $ pip --version
pip 18.0 from /Users/hoefling/.virtualenvs/myenv/lib/python3.7/site-packages/pip (python 3.7)
Run Code Online (Sandbox Code Playgroud)