求助大黑:关于 macOS 的 Python 版本混乱的若干问题

52 天前
 GooogIe

我是小白,求助大黑,关于 macOS 的 Python 版本混乱的若干问题,macOS 版本号 10.15.7 (19H2026)

通过上面的图片,我知道,我使用 brew 安装了 Python 的 4 个版本:python3.9 、python3.10 、python3.11 、python3.12 ,系统自带的是 Python2.7 。

我比较疑惑的是下面 pip 的问题

通过上面的图片,我知道,安装了 Python 的几个版本后,自带了很多的相对应版本的 pip ,

2709 次点击
所在节点    Python
32 条回复
susimonxu4203
52 天前
建议使用 miniconda (相比于 anaconda 更加轻量)来管理 python 环境。
```
wget "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh" -O ~/miniconda.sh
bash ~/miniconda.sh -b -p $HOME/miniconda
~/miniconda/bin/conda init $(echo $SHELL | awk -F '/' '{print $3}')
echo 'Successfully installed miniconda...'
```
使用 shell 运行上述命令即可安装 miniconda 。

然后你的终端前面就会有一个(base),代表你现在处于 base 环境中,你可以使用 conda create -n new_env python==3.9 这样的命令新建一个 python 环境,使用 conda activate new_env 来切换到你新建的这个 python 环境。

由于 python 的包的依赖问题,所以你在本地环境安装多个 python 肯定会导致各种依赖混乱。
yuhui
52 天前
@arischow
总结的挺好

我自己喜欢用 n 来做 Node 多版本管理器。
yuhui
52 天前
anaconda 有商业 license 的要求,没有购买的话,大厂应该是不允许用的。
xing7673
52 天前
用 conda ,不要用 pyenv ,太麻烦了。
wowo243
52 天前
咋没有一个正了八经的回答呢,本人没用过 macos ,但是在 windows 、linux 下用过 python ,按照自己的理解回答下,如果有大佬发现问题,欢迎指正
1 、/User/xxx/Library/Python/3.8/site-packages/pip 猜测应该是类似于 windows 下安装软件时选择的“仅为当前用户安装”。如果在 windows 下安装软件时勾选了这个选项,就会安装到 windows 对应的用户目录下;否则会安装到默认的程序目录,对比 op 的截图中就是 /usr/local/lib/xxxx
2 、修改环境变量指定默认的 pip 版本,可以始终使用默认版本的 pip ,当需要不同版本的时候需要手动输入对应命令
3 、venv 的问题,6 楼解释过了,在开发或者线上系统里,相比较于占用磁盘空间,保持运行环境的一致性是更重要的,可以避免很多依赖冲突问题;如果 op 不是用来开发软件系统,可以不考虑 venv 的问题
4 、macos 不是很清楚,linux 的 python 应该是跟发行版默认打包的有关系,一般跟 python 官网对应版本的区别不大,如果删除了可能会导致一些软件的运行出现问题;本人之前就遇到过 linux 删除了 python 导致一些后安装工具类的应用无法运行。
5 、猜测可能是 pip 各个版本安装路径的不同,windows 版本的 python 在某几个版本上默认安装路径是有差别的,但是考虑兼容性,也会在旧版的路径下建立快捷方式(类似软连接)
killva4624
52 天前
https://github.com/astral-sh/uv

也可以看看这个项目,同样是虚拟环境,用 rust 对 pyenv 解依赖
cosette
52 天前
个人建议是不要直接使用 brew 安装的 Python ,除非是你主动安装的,因为作为依赖安装的 Python 会随着升级而升级版本,带来非常多的问题。

brew 本身是非常激进的,会保留最新版本,也就是说,pip3 、Python3 这些命令作为软链接指向的永远是最新的,即便你不喜欢虚拟环境,但是直接使用 brew 来管理 Python 依然是非常糟糕的想法。

之所以会出现不同版本的 Python ,因为系统软件也好,brew 安装的第三方软件也好,会不同程度的依赖不同的版本,只要有一个软件直接或者间接的依赖某个 Python 版本,brew 就会安装它,但随着后续升级,brew 也会同步更新,如果你因为 brew 安装了 Python 就直接用,大抵上会发现之前安装的 package 失踪了。

一句话总结就是,Python 生态就是这样的,只有你适应它。
onsdriver
52 天前
可以用 pythonx.xx -m pip 来调用 pip
vincentqiao
52 天前
同小白,以上问题很多也不知道怎么回事/怎么解决,曾经有一次卸载 brew 的 Python 导致系统崩溃了

但是,推荐使用 pdm 或者 rye 来管理 Python 版本和项目依赖
1. 都有中心缓存机制不会占用太多内存
2. 都可以管理 Python 版本,不会有版本混乱的问题
3. 封装了 pip 、venv 这些,不用关注怎么使用这些背后的命令

所以基本上:init\add 命令用来初始化项目和添加依赖、fetch 命令用来下载 Python 版本就够了,使用非常简单,小白友好

https://rye-up.com/guide/installation/
https://pdm-project.org/latest/
lululau
52 天前
把系统管理(包括 Homebrew 安装)的 Python 挂载到 pyenv 管理:
```
if [ -z "$HOMEBREW_PREFIX" ]; then
if [ -e "/opt/homebrew/bin/brew" ]; then
HOMEBREW_PREFIX="/opt/homebrew"
else
HOMEBREW_PREFIX="/usr/local"
fi
fi

mkdir -p ~/.pyenv/versions

if [ -e "$HOMEBREW_PREFIX/Cellar/python@2" ]; then
ln -nfs $HOMEBREW_PREFIX/Cellar/python@2/2*(On[1]) ~/.pyenv/versions/
ln -nfs $HOMEBREW_PREFIX/Cellar/python@2/2*(On[1]) ~/.pyenv/versions/2
fi

if [ -e "$HOMEBREW_PREFIX/Cellar/python@3.12" ]; then
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.12/3*(On[1]) ~/.pyenv/versions/
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.12/3*(On[1]) ~/.pyenv/versions/3
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.12/3*(On[1]) ~/.pyenv/versions/3.12
fi

if [ -e "$HOMEBREW_PREFIX/Cellar/python@3.11" ]; then
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.11/3*(On[1]) ~/.pyenv/versions/3.11
fi

if [ -e "$HOMEBREW_PREFIX/Cellar/python@3.10" ]; then
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.10/3*(On[1]) ~/.pyenv/versions/3.10
fi


if [ -e "$HOMEBREW_PREFIX/Cellar/python@3.9" ]; then
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.9/3*(On[1]) ~/.pyenv/versions/3.9
fi

if [ -e "$HOMEBREW_PREFIX/Cellar/python@3.8" ]; then
ln -nfs $HOMEBREW_PREFIX/Cellar/python@3.8/3*(On[1]) ~/.pyenv/versions/3.8
fi

cd ~/.pyenv/versions/3/bin
cp -Rf python3.12 python3
cp -Rf python3 python
cp -Rf pip3.12 pip3
cp -Rf pip3 pip
cp -Rf pydoc3.12 pydoc3
cp -Rf python3.12-config python3-config
cp -Rf 2to3-3.12 2to3
cp -Rf idle3.12 idle3
ln -nfs wheel3.12 wheel3

if [ -e ~/.pyenv/versions/3.11 ]; then
cd ~/.pyenv/versions/3.11/bin
cp -Rf python3.11 python3
cp -Rf python3 python
cp -Rf pip3.11 pip3
cp -Rf pip3 pip
cp -Rf pydoc3.11 pydoc3
cp -Rf python3.11-config python3-config
cp -Rf 2to3-3.11 2to3
cp -Rf idle3.11 idle3
ln -nfs wheel3.11 wheel3
fi

if [ -e ~/.pyenv/versions/3.10 ]; then
cd ~/.pyenv/versions/3.10/bin
cp -Rf python3.10 python3
cp -Rf python3 python
cp -Rf pip3.10 pip3
cp -Rf pip3 pip
fi

if [ -e ~/.pyenv/versions/3.9 ]; then
cd ~/.pyenv/versions/3.9/bin
cp -Rf python3.9 python3
cp -Rf python3.9 python
cp -Rf pip3.9 pip3
cp -Rf pip3.9 pip
fi

if [ -e ~/.pyenv/versions/3.8 ]; then
cd ~/.pyenv/versions/3.8/bin
cp -Rf python3.8 python3
cp -Rf python3.8 python
cp -Rf pip3.8 pip3
cp -Rf pip3.8 pip
fi
```
GooogIe
52 天前
@lululau 感谢🙏🏻
julyclyde
46 天前
其实,似乎只有问题 1 是有问题的
但是很多回答,大家都关注输出观点而不关注问题本身啊?

1 我也很好奇,我建议看一下 pip3.10 它对应的 hashbang 的 python 的版本,及这个版本对应的 site-packages 路径?
2 建议就只用一个,最新的或者最新之前那一个;更早的已经没什么意义了
3 不是浪费,而是以自己的金钱支援了存储方向的同行
4 很少见不同的软件依赖不同的 python 版本这个情况啊。我以为这是一种中间状态,很快就会统一升级到较新的相同基准版本上呢?

现在 linux 界已经流行所谓 platform-python 的概念了,就是只为系统自带工具准备的 python ,和用户的 python 分离,以避免类似于,之前有人把 python 从 2.4 升级到 2.6 然后 yum 无法 import 之类的破事。对用户来说,如果系统里只有 platform-python ,则相当于并未安装 python ,有需要再另外装;对 ansible 来说,platform-python 是“其中一个可用的 python”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1038328

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX