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了解很浅, 很可能有错误, 希望大家指出, 谢谢.