升级 pip 时的一个坑

升级 pip 过程中踩了个坑。其实之前也升级过不过很巧合绕过去了。这次踩到做个记录。

事情是这样的,我需要写一个爬虫,所以就安装了bs4(喔,漂亮的肥皂)。然后安装后pip提示我新版本出来了。作为一个『不更新不舒服斯基』,我顺手就 pip install --upgrade pip 了。其实它提示的命令是 python -m pip install --upgrade pip 的,但在Scripts加入了系统路径的情况下(比较新的版本,安装的时候自动就帮你添加了), 直接pip 不是一样吗。然后就出现了下面这样的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
C:\Users\JayceChant>pip install beautifulsoup4
Collecting beautifulsoup4
Downloading beautifulsoup4-4.5.1-py3-none-any.whl (83kB)
100% |████████████████████████████████| 92kB 93kB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.5.1
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
C:\Users\JayceChant>pip install --upgrade pip
Collecting pip
Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 6.4kB/s
Installing collected packages: pip
Found existing installation: pip 8.1.1
Uninstalling pip-8.1.1:
Exception:
Traceback (most recent call last):
File "d:\dev\python35\lib\shutil.py", line 538, in move
os.rename(src, real_dst)
OSError: [WinError 17] 系统无法将文件移到不同的磁盘驱动器。: 'd:\\dev\\python35\\scripts\\pip.exe' -> 'C:\\Users\\JAYCEC~1\\AppData\\Local\\Temp\\pip-wgmxmz1x-u
ninstall\\dev\\python35\\scripts\\pip.exe'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "d:\dev\python35\lib\site-packages\pip\basecommand.py", line 209, in main
File "d:\dev\python35\lib\site-packages\pip\commands\install.py", line 317, in run
File "d:\dev\python35\lib\site-packages\pip\req\req_set.py", line 726, in install
File "d:\dev\python35\lib\site-packages\pip\req\req_install.py", line 746, in uninstall
File "d:\dev\python35\lib\site-packages\pip\req\req_uninstall.py", line 115, in remove
File "d:\dev\python35\lib\site-packages\pip\utils\__init__.py", line 267, in renames
File "d:\dev\python35\lib\shutil.py", line 553, in move
os.unlink(src)
PermissionError: [WinError 5] 拒绝访问。: 'd:\\dev\\python35\\scripts\\pip.exe'
C:\Users\JayceChant>pip install --upgrade pip
Traceback (most recent call last):
File "d:\dev\python35\lib\runpy.py", line 184, in _run_module_as_main
"__main__", mod_spec)
File "d:\dev\python35\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "D:\Dev\Python35\Scripts\pip.exe\__main__.py", line 5, in <module>
ImportError: No module named 'pip'

翻译一下:

  1. 因为 pip.exe 正在运行,所以无法将新的pip.exe覆盖上去
  2. 因为没权限,另外一个错误产生了
  3. 升级失败想再来一次?不好意思,旧版本已经卸载了,根本找不到

我去,直接蒙圈了,就随手更新一下,直接就把pip弄没了。我还得手动安装一次pip?虽然不难,但折腾啊。

Google一下,发现有人提供issue了:https://github.com/pypa/pip/issues/3804

我把关键的信息搬运一下(大意汇总 + 翻译,不一一对应):

pip.exe 正在运行,所以无法替换对应的文件,与其说是错误,不如说是系统限制。

以系统管理员运行,用 python -m pip install –upgrade pip 更新就可以了。

(pip.exe 实际上指向pip-script.py,然后里面再加载pip模块并运行,实际效果就跟 python -m pip install --upgrade pip 一样。但不一样的是,前者运行锁定了pip.exe,而后者实际上只运行了 python.exe。)

然后什么都没做,这个issue就作为https://github.com/pypa/pip/issues/1299 的 duplicated issue 被 closed了。

有兴趣可以看1299下面的讨论,太长我就不翻了。

还好还有 easy_install,easy_install pip,恢复正常。


知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议
本文为本人原创,采用知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
详情请点击查看协议具体内容。