V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
GooogIe
V2EX  ›  Python

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

  •  
  •   GooogIe · 232 天前 · 3661 次点击
    这是一个创建于 232 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    python1

    python2

    python3

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

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

    pip

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

    • 问题 1:为什么 pip3.10 的本地路径是/Library/Python/3.8/site-packages/pip 呢?
    • 问题 2:我如何管理好这么多的 pip 呢?有时候 pip 完成后,不同的 python 版本,是找不到相关的包的。
    • 问题 3:我知道大家肯定会提到虚拟环境 virtualenv 或者 venv ,我使用过这个东西,但是感觉每次写代码都要重新下载一遍相关的 package ,这不是对磁盘的一种浪费吗?
    • 问题 4:我为什么安装这么多版本的 Python ,因为我使用 brew 管理很多 macOS 的软件,brew 有依赖管理的功能,所以不同的软件依赖不同的 Python 版本,所以就会有这么多的 Python 版本了,所以我想问,这些 Python 版本和系统的 Python 版本有什么不同吗,系统自带了 Python2.7 ,那么是不是有很多系统软件或者三方软件会依赖系统的 Python 版本呢,如果我把系统的 Python 删除了,或者我把系统的 PATH 路径下面的可执行命令 python 替换成我自己 alias 的 python3 的命令,会不会影响依赖系统 python 的相关软件呢
    32 条回复    2024-05-13 13:23:41 +08:00
    GooogIe
        1
    GooogIe  
    OP
       232 天前
    问题 5:为什么只有 pip3.12 是一个软连接,而 pip3.10 和 pip3.11 和 pip3.8 是一个文件
    hongweijie8
        2
    hongweijie8  
       232 天前   ❤️ 1
    我要是你我就把所有的删了,然后装一个 3.8 ,用 venv
    Livid
        3
    Livid  
    MOD
       232 天前   ❤️ 1
    gray0
        4
    gray0  
       232 天前
    同样推荐 pyenv
    OCD2057
        5
    OCD2057  
       232 天前
    pyenv 或者 conda 解决这种多版本的问题
    arischow
        6
    arischow  
       232 天前
    Python: pyenv ( Python 版本管理器) + Pip / Poetry / Pipenv (项目包管理器)

    对应

    Node: nvm ( Node 版本管理器)+ npm / yarn / ... (项目包管理器)
    digd
        7
    digd  
       232 天前
    建议还是用 conda 来管理环境!怎么能用 brew 安装这么多 python ,太脏了

    安装一个 miniconda 吧
    jollywang
        8
    jollywang  
       232 天前
    我是用 mise, 可以版本管理 python, node, java 等, 本身是 rust 开发, 无其他依赖
    https://mise.jdx.dev/lang/python.html

    pyenv, nvm, nodenv 之类的配置还不统一
    jollywang
        9
    jollywang  
       232 天前
    系统自带的就一个默认 ruby/python 版本, 但也不用, 其他的就还是用这个来管理 python/node/java/golang 都没啥问题
    makaflow
        10
    makaflow  
       231 天前
    不要直接使用 brew 安装的 python ,brew 的 python 只为 brew 安装的软件提供依赖,不是给用户服务的。因为伴随着 brew 对软件包的升级,安装的 python 包会不见而且会影响依赖 python 的软件包。所以,你如果想使用 python ,需要自己安装个 anaconda 或其他管理软件,然后把 anaconda 的 bin 目录放到 PATH 变量的最前面就可以了。
    raycool
        11
    raycool  
       231 天前
    直接 conda 或者 miniconda 吧
    strawberrydafu
        12
    strawberrydafu  
       231 天前
    顺便也问问。我之前是一直用 conda ,没遇到啥问题。前端时间想试试切换到 poetry ,结果发现 poetry 把 conda 的环境配置给拦截了。不知道有没有朋友解决过类似的问题。有没有办法让 conda 和 poetry 一起用
    1252603486
        13
    1252603486  
       231 天前
    用 versionfox 吧,很多语言都支持,挺好的
    jqtmviyu
        14
    jqtmviyu  
       231 天前
    我也是小白, 这个问题之前也问过类似的.
    问题 1: 我猜是没有暴露环境变量的原因.
    问题 2: 用 venv
    问题 3: 有第三方的 pdm.
    问题 4: 我猜类似 npm 的依赖链, 没找到版本就帮你下. 删了可能能用, 也可能出错.

    建议一步到位用 rye+uv/pyenv+uv
    founddev
        15
    founddev  
       231 天前
    pyenv+poetry
    fkdog
        16
    fkdog  
       231 天前
    感觉 python 的虚拟环境是真的多。
    venv virtualenv pyenv conda
    retanoj
        17
    retanoj  
       231 天前
    考虑下 asdf
    noahlias
        18
    noahlias  
       231 天前
    正常 你用 brew 就会有这种情况 很多软件有的更新策略很保守 有的又很激进它们的依赖不一样
    导致 mac 上 brew 带的 python 版本很多混乱,我基本不用它自带的
    我要么用 conda 或者 rye 来管理,conda 主要是由一些科学计算(包括 AI)的包比较方便,rye 偏 python 工程
    题外话 brew 安装的时候经常会有 dylib 会有软链接版本不对导致有些软件 bus error
    每次要么安装--head 版本或者直接 brew upgrade 更新所有依赖才能避免
    zackzergzeng
        19
    zackzergzeng  
       231 天前
    如果这么乱的话我一般用 ```python -m pip```来使用对应 python 的 pip
    一般/usr/local/bin 下的文件都是软链在别处的吧,macos 一般都是本体安装到 Library 下再软链回来的
    你要想知道 pip3.10 为什么指向有问题的话就直接 vim 看一眼里面代码被,反正 pip 就是一个 py 脚本
    ZnductR0MjHvjRQ3
        20
    ZnductR0MjHvjRQ3  
       231 天前
    @hongweijie8 正解
    susimonxu4203
        21
    susimonxu4203  
       231 天前
    建议使用 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
        22
    yuhui  
       231 天前
    @arischow
    总结的挺好

    我自己喜欢用 n 来做 Node 多版本管理器。
    yuhui
        23
    yuhui  
       231 天前
    anaconda 有商业 license 的要求,没有购买的话,大厂应该是不允许用的。
    xing7673
        24
    xing7673  
       231 天前
    用 conda ,不要用 pyenv ,太麻烦了。
    wowo243
        25
    wowo243  
       231 天前
    咋没有一个正了八经的回答呢,本人没用过 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
        26
    killva4624  
       231 天前
    https://github.com/astral-sh/uv

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

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

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

    一句话总结就是,Python 生态就是这样的,只有你适应它。
    onsdriver
        28
    onsdriver  
       231 天前
    可以用 pythonx.xx -m pip 来调用 pip
    vincentqiao
        29
    vincentqiao  
       231 天前
    同小白,以上问题很多也不知道怎么回事/怎么解决,曾经有一次卸载 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
        30
    lululau  
       231 天前   ❤️ 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
    ```
    GooogIe
        31
    GooogIe  
    OP
       231 天前 via Android
    @lululau 感谢🙏🏻
    julyclyde
        32
    julyclyde  
       226 天前
    其实,似乎只有问题 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”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5683 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.