- 问题
- 解决
命令前面加上 python -m pip
python -m pip是什么?
首先,python -m pip会使用您指定为python的Python解释器来执行pip。因此,/usr/bin/python3.7 -m pip表示您正在执行位于/usr/bin/python3.7的解释器的pip。如果您不熟悉这个标志以及它是如何工作的,您可以阅读有关-m的文档(它非常方便)。
为什么使用 python -m pip 而不是 pip/pip3?
所以您可能会说,“好的,但是我不能通过执行pip命令来运行pip吗?”答案是“可以,但是您对它的控制会更少”,我将用一个例子来解释我所说的“控制会更少”是什么意思。
假设我已经安装了Python的两个版本,比如Python 3.7和3.8(由于Python会预先安装在macOS和Linux上,这对人们来说是很常见的,更不用说您之前已经安装了Python 3.7,您还是会安装Python 3.8来使用它)。现在,如果您在您的终端中键入pip,那么它将为哪个Python解释器安装库呢?
在没有更多的细节的情况下,您的答案是您不知道。首先,您必须知道我的PATH设置是什么,比如/usr/bin是在/usr/local/bin之前还是之后(这些是安装Python的常见位置,通常优先安装于/usr/local/目录)。好的,只要您记得您安装Python 3.7和3.8的地方,它们是不同的目录,您就会知道哪个版本的pip在PATH上先出现。假设您都是手动安装它们的,也许您的操作系统附带了Python 3.7.3,而您又安装了Python 3.7.5。在这种情况下,Python的两个版本都安装在/usr/local/bin中。现在您能告诉我pip与哪个解释器相关联吗?
答案是您仍然不知道。除非您知道您在什么时候安装了每个版本,从而就会知道被写到/usr/local/bin/pip的最后一个pip副本是什么,否则您就不知道哪个解释器的pip将被用于执行pip命令。现在您可能会说,“我总是会安装最新的版本,这意味着Python 3.8.0是最后安装的,因为它比3.7.5更新。”好的,但是当Python 3.7.6出现时会发生什么呢?您的pip命令将会从使用Python 3.8变为使用Python 3.7。
但是当您使用python -m pip时,而python是您希望使用的特定解释器时,所有上述的模糊性都消失了。如果我使用python3.8 -m pip,那么我就知道pip将会在我的Python 3.8解释器中使用和安装(如果我使用的是python3.7,那么情况也一样)。
如果您是在Windows上运行,使用python -m pip还有一个额外的好处,那就是它可以让pip自我更新。基本上,当您执行pip install --upgrade pip时,系统会认为pip.exe正在运行,
因此,Windows是不会让您覆盖pip.exe的。但是,如果您执行python -m pip install --upgrade pip,就可以避免这个问题,因为正在运行的是python.exe,不是pip.exe。