我现在的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

  1. $path_prefix/lib(标准库路径)
  2. $path_prefix/lib/pythonX.Y/site-packages(三方库路径,X.Y 是对应 Python 的主次版本号,如 3.7, 2.6)
  3. 当前工作目录(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