Windows虚拟环境执行pip install --upgrade pip提示‘Access denied’失败问题
Windows虚拟环境升级pip遇Access Denied的坑?我来教你解决!
先说说你遇到的情况
简直和我之前碰到的一模一样:用python -m venv建好虚拟环境,激活后跑pip install --upgrade pip,结果不管有没有管理员权限,都弹出这个错误:
Could not install packages due to an EnvironmentError: [WinError 5] Access is denied: 'd:\scratch\my-venv\scripts\pip.exe'
而且官方提示的--user选项完全没用,毕竟我们要升级的是虚拟环境里的pip,不是用户全局的。
问题到底出在哪?
这真不是你权限不够,是Windows的文件锁定机制在搞事情!当你直接运行pip.exe的时候,这个进程正占用着自己的可执行文件,Windows有个硬规则:正在被进程使用的exe文件不能被修改或替换——哪怕你对这个文件有完全读写权限也不行。
靠谱的解决方法来了
按推荐程度给你列几个方案:
1. 用Python模块方式升级(最简单有效)
激活虚拟环境后,别直接敲pip,改成通过Python解释器调用pip模块:
python -m pip install --upgrade pip
这样跑的是Python进程,不是直接启动pip.exe,不会锁定那个要被替换的exe文件,升级过程就能顺利完成。
2. 用get-pip.py脚本重装pip
如果第一种方法还不行,试试官方的get-pip脚本:
- 先拿到
get-pip.py脚本(从pip官方发布的渠道获取就行) - 激活虚拟环境后执行:
python get-pip.py
这个脚本会直接下载并安装最新版的pip,彻底覆盖虚拟环境里的旧版本,完全绕开进程锁定的问题。
3. 手动删旧pip再重装(备用方案)
要是上面两种都没搞定,就手动操作一波:
- 先退出虚拟环境(输入
deactivate回车) - 找到虚拟环境的
Scripts目录(比如d:\scratch\my-venv\scripts),删掉里面的pip.exe、pip3.exe、pip3.7.exe(对应你的Python版本号) - 重新激活虚拟环境,运行:
python -m ensurepip --upgrade
这个命令会自动给虚拟环境重新装上最新版的pip。
为啥--user选项没用?
官方提示的--user是把pip装到当前用户的全局Python目录,根本不是虚拟环境的目录,所以完全达不到升级虚拟环境内pip的目的,这个提示在这种场景下确实没帮助。
内容的提问来源于stack exchange,提问作者zwol




