Ubuntu 更新后出现多个 Python 版本

电脑本来只有一个 Python3.10, 可能是由于系统升级的原因,发现电脑多了一个 Python3.11 版本,这带来了好多麻烦,比如我很多软件包都安装在 python3.10 中,但是命令行输入 pip 调用的是 python3.11 的,并且之前创建的虚拟环境感觉也不太正常了。

我决定删除旧版本 Python

python3.10 -m pip freeze > backup.txt # 备份已安装的包
sudo apt purge python3.10
sudo apt autoremove

接下来是恢复之前安装的软件包,不过这里遇到了错误

$ pip install -r backup.txt
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

查阅了一番资料后,发现,原因可能在于,现在电脑上的 Python3.11 是 Linux 系统包管理器提供的,使用 pip 安装软件包可能会干扰到原本系统软件包的正常工作,因此在这种情况下,比较推荐的做法是:

  • 系统层面的 python 软件包,使用包管理器安装,例如 apt install python3-xxx
  • 项目/本地层面创建虚拟环境,在虚拟环境内使用 pip 安装

最终,我选择在系统层面安装一些基础性的软件包 python3-virtualenv, python3-pytest (不过可惜的是并没有 pipreqs 可以安装,只能 pip 安装……),其余的依赖项则在项目文件夹中 pip 安装。

为了方便,我在 zsh 设定中添加了下面的函数方便调用:

create-virtualenv() {
    virtualenv .venv
    source .venv/bin/activate
    pip install pipreqs
}

参考资料:

其他说明

如果保留两个版本,只需要日常使用时稍微注意下就好了,例如,需要使用 Python3.10 时:

python3.10
python3.10 -m pip
posted @ 2023-08-03 17:44  BuckyI  阅读(648)  评论(0编辑  收藏  举报