我是小白,求助大黑,关于 macOS 的 Python 版本混乱的若干问题,macOS 版本号 10.15.7 (19H2026)
通过上面的图片,我知道,我使用 brew 安装了 Python 的 4 个版本:python3.9 、python3.10 、python3.11 、python3.12 ,系统自带的是 Python2.7 。
我比较疑惑的是下面 pip 的问题
通过上面的图片,我知道,安装了 Python 的几个版本后,自带了很多的相对应版本的 pip ,
1
GooogIe OP 问题 5:为什么只有 pip3.12 是一个软连接,而 pip3.10 和 pip3.11 和 pip3.8 是一个文件
|
2
hongweijie8 226 天前 1
我要是你我就把所有的删了,然后装一个 3.8 ,用 venv
|
3
Livid MOD |
4
gray0 226 天前
同样推荐 pyenv
|
5
OCD2057 226 天前
pyenv 或者 conda 解决这种多版本的问题
|
6
arischow 226 天前
Python: pyenv ( Python 版本管理器) + Pip / Poetry / Pipenv (项目包管理器)
对应 Node: nvm ( Node 版本管理器)+ npm / yarn / ... (项目包管理器) |
7
digd 226 天前
建议还是用 conda 来管理环境!怎么能用 brew 安装这么多 python ,太脏了
安装一个 miniconda 吧 |
8
jollywang 226 天前
我是用 mise, 可以版本管理 python, node, java 等, 本身是 rust 开发, 无其他依赖
https://mise.jdx.dev/lang/python.html pyenv, nvm, nodenv 之类的配置还不统一 |
9
jollywang 226 天前
系统自带的就一个默认 ruby/python 版本, 但也不用, 其他的就还是用这个来管理 python/node/java/golang 都没啥问题
|
10
makaflow 226 天前
不要直接使用 brew 安装的 python ,brew 的 python 只为 brew 安装的软件提供依赖,不是给用户服务的。因为伴随着 brew 对软件包的升级,安装的 python 包会不见而且会影响依赖 python 的软件包。所以,你如果想使用 python ,需要自己安装个 anaconda 或其他管理软件,然后把 anaconda 的 bin 目录放到 PATH 变量的最前面就可以了。
|
11
raycool 226 天前
直接 conda 或者 miniconda 吧
|
12
strawberrydafu 226 天前
顺便也问问。我之前是一直用 conda ,没遇到啥问题。前端时间想试试切换到 poetry ,结果发现 poetry 把 conda 的环境配置给拦截了。不知道有没有朋友解决过类似的问题。有没有办法让 conda 和 poetry 一起用
|
13
1252603486 226 天前
用 versionfox 吧,很多语言都支持,挺好的
|
14
jqtmviyu 226 天前
我也是小白, 这个问题之前也问过类似的.
问题 1: 我猜是没有暴露环境变量的原因. 问题 2: 用 venv 问题 3: 有第三方的 pdm. 问题 4: 我猜类似 npm 的依赖链, 没找到版本就帮你下. 删了可能能用, 也可能出错. 建议一步到位用 rye+uv/pyenv+uv |
15
founddev 226 天前
pyenv+poetry
|
16
fkdog 226 天前
感觉 python 的虚拟环境是真的多。
venv virtualenv pyenv conda |
17
retanoj 226 天前
考虑下 asdf
|
18
noahlias 226 天前
正常 你用 brew 就会有这种情况 很多软件有的更新策略很保守 有的又很激进它们的依赖不一样
导致 mac 上 brew 带的 python 版本很多混乱,我基本不用它自带的 我要么用 conda 或者 rye 来管理,conda 主要是由一些科学计算(包括 AI)的包比较方便,rye 偏 python 工程 题外话 brew 安装的时候经常会有 dylib 会有软链接版本不对导致有些软件 bus error 每次要么安装--head 版本或者直接 brew upgrade 更新所有依赖才能避免 |
19
zackzergzeng 226 天前
如果这么乱的话我一般用 ```python -m pip```来使用对应 python 的 pip
一般/usr/local/bin 下的文件都是软链在别处的吧,macos 一般都是本体安装到 Library 下再软链回来的 你要想知道 pip3.10 为什么指向有问题的话就直接 vim 看一眼里面代码被,反正 pip 就是一个 py 脚本 |
20
ZnductR0MjHvjRQ3 226 天前
@hongweijie8 正解
|
21
susimonxu4203 226 天前
建议使用 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 肯定会导致各种依赖混乱。 |
23
yuhui 226 天前
anaconda 有商业 license 的要求,没有购买的话,大厂应该是不允许用的。
|
24
xing7673 226 天前
用 conda ,不要用 pyenv ,太麻烦了。
|
25
wowo243 226 天前
咋没有一个正了八经的回答呢,本人没用过 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 在某几个版本上默认安装路径是有差别的,但是考虑兼容性,也会在旧版的路径下建立快捷方式(类似软连接) |
26
killva4624 226 天前
|
27
cosette 226 天前
个人建议是不要直接使用 brew 安装的 Python ,除非是你主动安装的,因为作为依赖安装的 Python 会随着升级而升级版本,带来非常多的问题。
brew 本身是非常激进的,会保留最新版本,也就是说,pip3 、Python3 这些命令作为软链接指向的永远是最新的,即便你不喜欢虚拟环境,但是直接使用 brew 来管理 Python 依然是非常糟糕的想法。 之所以会出现不同版本的 Python ,因为系统软件也好,brew 安装的第三方软件也好,会不同程度的依赖不同的版本,只要有一个软件直接或者间接的依赖某个 Python 版本,brew 就会安装它,但随着后续升级,brew 也会同步更新,如果你因为 brew 安装了 Python 就直接用,大抵上会发现之前安装的 package 失踪了。 一句话总结就是,Python 生态就是这样的,只有你适应它。 |
28
onsdriver 226 天前
可以用 pythonx.xx -m pip 来调用 pip
|
29
vincentqiao 226 天前
同小白,以上问题很多也不知道怎么回事/怎么解决,曾经有一次卸载 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/ |
30
lululau 226 天前 1
把系统管理(包括 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/[email protected]" ]; then ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/3*(On[1]) ~/.pyenv/versions/ ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/3*(On[1]) ~/.pyenv/versions/3 ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/3*(On[1]) ~/.pyenv/versions/3.12 fi if [ -e "$HOMEBREW_PREFIX/Cellar/[email protected]" ]; then ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/3*(On[1]) ~/.pyenv/versions/3.11 fi if [ -e "$HOMEBREW_PREFIX/Cellar/[email protected]" ]; then ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/3*(On[1]) ~/.pyenv/versions/3.10 fi if [ -e "$HOMEBREW_PREFIX/Cellar/[email protected]" ]; then ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/3*(On[1]) ~/.pyenv/versions/3.9 fi if [ -e "$HOMEBREW_PREFIX/Cellar/[email protected]" ]; then ln -nfs $HOMEBREW_PREFIX/Cellar/[email protected]/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 ``` |
32
julyclyde 220 天前
其实,似乎只有问题 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” |