mac上装有多个python和多个pip,pip到底是指向哪个python?以及如何修改这种行为?

这个问题从我两年半前学python就困惑着我(至今python水平也没有提高..).

我的问题是, which python3告诉我, 是/usr/local/bin/python3, which pip3告诉我, 是/usr/local/bin/pip3. 但是当我pip3 show requests时, 啥结果也没有, 虽然我肯定我装了这个包.

首先需要搞清楚, pip和python之间的关系是什么. 是一个版本的pip对应一个python解释器么? 还是一个pip可以对应多个python? 其实pip是某个python的包. 所以可以说一个python解释器对应一个pip./usr/local/bin/pip3是个symlink, 指向的其实是某个可执行文件. 怎么知道它指向的是哪个可执行文件? 可以用这个python -c "import os; print(os.path.realpath('/usr/local/bin/pip3'))", 其实相当于GNU下的readlink -f, 但mac的readlink不是GNU的, 不支持递归(虽然这个例子里, 不需要递归, mac上直接readlink pip3也行). 总之我得到了

/usr/local/Cellar/python@3.8/3.8.5/bin/pip3

这下我知道了, usr/local/bin/下的pip3不是我想要的.

我不想要它, 想把python3.7的pip3替代它.

我只需要找到python3.7中的pip3的位置即可. python3 -m pip -V 可以做到. 得到了

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pip

不过这是个目录. 不是脚本. 那怎么办? 我电脑上还装着anaconda的python, 我把它的pip内容给拷贝了, 改一改第一行shebang中的解释器. 然后放在/usr/local/bin下. 具体内容如下.

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import re
import sys

from pip._internal.cli.main import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

是不是这就完了? 还不行. 需要给它添加可执行权限. 这下执行/usr/local/bin/pip就可以了.

但是此时执行pip, 还不是/usr/local/bin/pip, 需要重新打开一个session, 那么首先被搜索到的就是它了.

终于解决了我多年的疑惑, 开心几分钟. 顺便我用类似的想法, 修改了python的指向, 本来它是指向python2.7的, 现在也指向了我想要的python版本.

注: 我对python了解很浅, 很可能有错误, 希望大家指出, 谢谢.

posted @ 2020-12-10 16:35  Tokubara  阅读(1042)  评论(0编辑  收藏  举报