我在Ubuntu 12.10上搞糟了系统版本的Python Pip。

72

我想在Python的主要安装中更新pip,特别是为了获得list命令。这还包括list-updates功能。

于是我运行了:

sudo pip install --upgrade pip

安装过程中一切看起来都很顺利,但是当我尝试运行pip时,出现了以下错误信息(如果有帮助,包括安装结束部分):

(end of install included if it helps)

Installing pip script to /usr/local/bin
    Installing pip-2.7 script to /usr/local/bin
Successfully installed pip
Cleaning up...
tom@tom-sam:~$ pip list -o
bash: /usr/bin/pip: No such file or directory
tom@tom-sam:~$ pip
bash: /usr/bin/pip: No such file or directory

显然,由于这是我的系统安装的Python版本,我已经失败了。我在这里阅读了一些答案,但还没有确定最简单的解决办法。


你尝试重新安装 python-pip 包了吗?我相信它会提供 /usr/bin/pip 程序。 - unutbu
实际上,我尝试使用easy_install重新安装pip,但没有帮助。 - dartdog
啊,我发现 /usr/bin 中的 pip 符号链接已经损坏了,并显示为 "This link cannot be used because its target "pip-2.7" does not exist"。应该怎么修复呢? - dartdog
在这种情况下,我猜你的/usr/bin优先于/usr/local/bin出现在你的PATH中。您可以执行sudo rm /usr/bin/pip来删除其中的损坏符号链接。之后,pip应该可以工作了,因为/usr/local/bin中的符号链接已经存在。 - wkl
3
这个命令是 "sudo ln -s /usr/local/bin/pip-2.7 /usr/bin/pip",它可以创建一个软链接,将"/usr/local/bin/pip-2.7" 路径下的 pip-2.7 文件链接到 "/usr/bin/pip" 路径下的 pip 文件。 - dartdog
显示剩余8条评论
6个回答

231

在进行apt-get的删除和安装操作之前,值得重置你的bash缓存。

hash -r
Bash会使用分发安装(apt-get)缓存pip的路径,即/usr/bin/pip。如果您仍然在同一Shell会话中,并更新了pip,则由于缓存,您的Shell仍将查找/usr/bin/而不是/usr/local/bin/。
例如:
$apt-get install python-pip
$which pip
/usr/bin/pip

$pip install -U pip
$which pip
/usr/bin/pip

$hash -r
$which pip
/usr/local/bin/pip

我按照上述每个命令运行了一遍(对我来说:在执行了“pip install -U pip”之后,控制台返回了“/usr/local/bin/pip”)- 一切都正常工作了,我可以再次运行“pip freeze”! - Jacob Irwin
太棒了 :o)我真的想不明白为什么pip没有被执行,因为我可以看到/usr/local/bin在PATH中。 - Storm
非分发软件/库/文档等通常安装在/usr/local/xxx而不是/usr/xxx。如果您echo $PATH,您会看到/usr/local/bin列在/usr/bin之前。这将确保我们安装的东西在apt之外被首先考虑。这也是nodejs的常见问题,因为exe的名称为nodejs而不是node。Npm需要node。因此,我们通过将/usr/bin/nodejs符号链接到/usr/local/bin/node来解决问题。希望这有助于理解为什么这样可以工作。 - boredcoding
以root用户登录,输入“which pip”并验证其是否为“/usr/local/bin/pip”,而不是“/usr/bin/pip”。如果是“/usr/bin/pip”,则根路径变量在查找“/usr/bin/”之前没有查找“/usr/local/bin/”。“hash -r”只是缓存重置,如果您的路径变量实际上是错误的,则它对您无济于事。在调用sudo时,如果没有告诉bash保持您已登录的用户环境处于活动状态,则会激活root用户的环境。有一些方法可以在运行sudo时保留您的环境。 例如。 https://dev59.com/BXVC5IYBdhLWcg3wjx1d - boredcoding
补充一下,hash -r 只会重置当前登录用户的缓存。解决方案可能很简单,只需以 root 用户身份登录并键入“hash -r”,或者将 /usr/local/bin; 添加到 root 用户的路径环境变量开头(或至少确保它在 /usr/bin 之前)。 - boredcoding
这真的帮了我很多,重新安装后,在运行pip时出现“没有这样的文件或目录”的错误,我按照你说的使用了hash -r,问题得到了解决。谢谢! - ellpei

84

我在Linux上也遇到了同样的信息。

/usr/bin/pip: No such file or directory

但是随后检查了哪个 pip 被调用。

$ which pip
/usr/local/bin/pip 

在我的Debian Wheezy机器上,我通过以下方式修复了它...
/usr/local/bin/pip uninstall pip  
apt-get remove python-pip  
apt-get install python-pip  

====================================
这是由于使用apt-get安装并使用pip install -U pip更新导致的混淆。

这些操作还在两个不同的位置安装了库,这给我带来了问题。

/usr/lib/python2.7/dist-packages  
/usr/local/lib/python2.7/dist-packages

2
这个命令可以解决问题:sudo ln -s /usr/local/bin/pip-2.7 /usr/bin/pip - dartdog
9
你可能确实希望使用@boredcoding 的答案,而不是使用这个答案。 - nedned
4
很遗憾,答案不正确,除非您首先执行hash -r操作。 - gented
不需要卸载或重新安装python-pip,如果环境变量出现问题,则按@dartdog建议的方式放置符号链接。因为卸载/重新安装方法会恢复pip 9.0的旧版本,而不是19.2。 - Shaze

9

我在升级pip后运行Mint 18.1时遇到了同样的问题。我通过关闭并重新打开终端解决了这个问题。


这对我也起作用了。我很高兴在卸载/重新安装之前读到了这篇文章。 - SunshinyDoyle

6
我遇到了与 @dartdog 相同的问题,幸好有 @Martin Mohan 和 @warvariuc 的帮助,我成功地完全卸载了 pip。
不幸的是,使用该命令时:
apt-get install python-pip 

安装了旧版本的pip,所以在执行以下操作后:
/usr/local/bin/pip uninstall pip  
apt-get remove python-pip  

安装最新的pip版本,我从https://bootstrap.pypa.io/get-pip.py获取了get-pip.py文件。
然后,在文件目录中,通过命令行执行了python get-pip.py命令。希望能帮到有需要的人。
另外,一些命令需要使用sudo权限。祝好运!

你可以通过 'sudo pip install -U pip' 命令来更新系统范围内的 pip。除非特殊情况,否则需要使用 sudo 来更改系统 Python,包括使用 pip 将软件包安装到系统范围内的软件包文件夹中。 - boredcoding
对于Python 2.7,请使用https://bootstrap.pypa.io/pip/2.7/get-pip.py。 - EliR

0

-2
我曾经在Python 3.5.2中使用pip。然后我在升级到Python 3.6时出了问题,于是我决定回退到3.5。在我删除pip-3.6之后,pip3指向/usr/local/bin/pip3,但实际的pip安装目录的符号链接丢失了。我用以下命令修复了它:

sudo ln -s /usr/bin/pip3 /usr/local/bin/pip3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接