`pip install --upgrade pip` 在 Windows virtualenv 中失败并显示“拒绝访问”

zwo*_*wol 4 python windows pip virtualenv

在 Windows 上,如果您尝试pip在 virtualenv 中自我升级,您可能会收到一个神秘的“访问被拒绝”错误。例如:

D:\scratch\> C:\Program Files\Python\3.7.4\x64\python.exe -m venv D:\scratch\my-venv
D:\scratch\> D:\scratch\my-venv\Scripts\activate
(my-venv) D:\scratch\> pip install --upgrade pip

Collecting pip
  Downloading pip-19.3.1-py2.py3-none-any.whl (1.4MB)
Installing collected packages: pip
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
Could not install packages due to an EnvironmentError: 
  [WinError 5] Access is denied: 'd:\\scratch\\my-venv\\scripts\\pip.exe'
Consider using the `--user` option or check the permissions.
Run Code Online (Sandbox Code Playgroud)

无论命令提示符是否具有管理权限,都会发生这种情况。我们知道我们对里面的所有东西都有写访问权限d:\scratch\my-venv,因为我们刚刚用初始python -m venv命令创建了它。使用该--user选项的建议无济于事,因为我们想升级virtualenv 中的 pip 版本,但这是--user行不通的。

可能有什么问题,在 Windows 上的 virtualenv 中升级 pip 的正确方法是什么?

zwo*_*wol 14

我不知道这是否是发生这种情况的唯一原因,但请注意“访问被拒绝”错误指向d:\scratch\my-venv\scripts\pip.exe. pip 正在尝试替换自身,而 Windows 不允许您以任何方式修改正在运行的 EXE 文件。

此特定问题的解决方法是python -m pip install --upgrade pip改用。这种方式pip.exe没有运行,所以 Windows 将允许它被替换。此操作不会尝试覆盖d:\scratch\my-venv\scripts\python.exe,Windows 也不关心 pip 对属于 pip 包的所有其他文件做了什么。

有关更多信息,请参阅https://github.com/pypa/pip/issues/188https://github.com/pypa/pip/issues/1299