我现在的mac上已经安装了如下几个python
/opt/homebrew/opt/python@3.10/bin/python3.10
/usr/bin/python3
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
这些包从哪里安装的
homebrew的安装包是通过homebrew使用brew命令进行安装的,可以使用brew uninstall进行卸载,如果brew安装的其他项目有使用python,就无法直接卸载了。
/usr/bin/python3这个python是系统自带的,不推荐卸载,/usr/bin/python3应该是一个硬链接。
python2是为了使用npm安装不得已下载的。
pip install安装的包放在哪里?
对于mac自带的python3,系统做了一些工作使得这个的安装包路径在/Users/<user_name>/Library/Python/3.8/lib/python/site-packages下
参考博客https://frostming.com/2019/03-13/where-do-your-packages-go/
Python 是如何寻找包的
现在大家的电脑上很可能不只有一个 Python,还有更多的虚拟环境,导致安装包的时候,一不小心你就忘记注意安装包的路径了。首先我们来解决找包的问题,这个问题回答起来很简单,但很多人不知道这个原理。假如你的 Python 解释器的路径是
$path_prefix/bin/python
,那么你启动 Python 交互环境或者用这个解释器运行脚本时,会默认寻找以下位置1:
$path_prefix/lib
(标准库路径)$path_prefix/lib/pythonX.Y/site-packages
(三方库路径,X.Y 是对应 Python 的主次版本号,如 3.7, 2.6)- 当前工作目录(
pwd
命令的返回结果)这里如果你用的是 Linux 上的默认 Python,
$path_prefix
就是/usr
,如果你是自己使用默认选项编译的,$path_prefix
就是/usr/local
。从上面第二条可以看到不同 Python 版本的三方库路径不同,如果你把 Python 从 3.6 升级到 3.7 那么之前装的三方库都没法用了。当然你可以整个文件夹都拷贝过去,大部分情况不会出问题。几个有用的函数
sys.executable
:当前使用的 Python 解释器路径sys.path
:当前包的搜索路径列表sys.prefix
:当前使用的$path_prefix
为什么vscode的终端使用的python3是brew的而系统的终端用的默认的python3
我重新打开了一个系统的终端之后也变成使用brew自带的了,说明是环境变量设置的问题。
使用echo $PATH
查看环境变量,得到结果
/Users/chuhuilong/.nvm/versions/node/v10.15.3/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
管理python
使用python遇到的最大问题就是python的版本管理了,虽然使用其他的语言也会有版本管理问题,但是python最大的难点在于,python2和python3不兼容,并且它们的安装方式还有多种,安装下来的位置也都不同。另外有些系统比如mac自带python3,种种原因使得python的版本管理地位非常重要,没有好的版本管理,就不清楚自己在运行什么版本,下载的包也会丢在不同的地方。
pyenv
根据这篇文章https://opensource.com/article/19/5/python-3-default-mac,博主在安装另一个软件时也遇到了和我一样的问题,python版本太多太混乱。很多人遇到了这些问题,于是有了各种解决方案,其中pyenv受到了Moshe Zadka的推荐。
pyenv使用很简单
安装brew **install** pyenv
下载指定pythonpyenv install 3.10.0
设置全局pythonpyenv global 3.7.3
需要在配置文件中添加一下配置
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc
经过测试能够改变全局的python版本,并且还自动把python下载的module放在了路径里,就不要要每次使用python -m指定module了。
查看一下环境变量
/Users/chuhuilong/.pyenv/shims:/Users/chuhuilong/.nvm/versions/node/v10.15.3/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin