
pep 668引入了“外部管理环境”机制,旨在避免系统python与用户安装包之间的冲突,导致在ubuntu 24.04等系统上直接使用`pip install --user`受阻。本文将深入解析pep 668的影响,并提供多种解决方案,包括官方推荐的虚拟环境、`pipx`,以及通过`pyenv`等第三方工具构建完全独立的用户级python环境,确保开发者能够灵活、安全地管理其python依赖。
随着Linux发行版对Python的深度集成,系统自带的Python环境承载着大量关键系统工具和服务的依赖。为了避免用户自行安装的Python包与系统包发生冲突,导致系统不稳定甚至崩溃,Python社区推出了PEP 668规范,并被Ubuntu 24.04等现代操作系统广泛采纳。
当用户尝试在受PEP 668保护的环境中直接使用pip install --user安装包时,通常会遇到以下错误提示:
$ pip install setuptools --user
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.这个错误明确指出当前Python环境由外部管理,并提供了几种官方推荐的解决方案,以确保包的安装符合规范且不会破坏系统。
PEP 668及其错误提示为我们指明了在“外部管理环境”下安装Python包的正确途径。
立即学习“Python免费学习笔记(深入)”;
虚拟环境是Python开发中最推荐的实践,它为每个项目提供了一个独立的Python解释器和包安装目录。这确保了项目之间的依赖隔离,互不干扰。
使用方法:
python3 -m venv my_project_venv
这会在当前目录下创建一个名为my_project_venv的文件夹,其中包含一个独立的Python环境。
source my_project_venv/bin/activate
.\my_project_venv\Scripts\Activate.ps1
.\my_project_venv\Scripts\activate.bat
激活后,命令行提示符通常会显示虚拟环境的名称(例如 (my_project_venv) $),此时pip和python命令都指向虚拟环境内的版本。
pip install your-package-name
包将安装到当前激活的虚拟环境中。
deactivate
适用场景: 任何需要管理项目特定依赖的Python开发。这是最通用和安全的做法。
pipx是一个专门用于安装和运行Python应用程序的工具。它为每个应用程序创建独立的虚拟环境,并将其可执行文件添加到系统的PATH中,使其可以像普通命令一样全局调用,而无需手动激活虚拟环境。
使用方法:
python3 -m pip install --user pipx python3 -m pipx ensurepath
(注意:在Ubuntu 24.04上,pipx通常可以通过apt install pipx直接安装。)
pipx install black pipx install poetry
这将把black和poetry等工具安装到独立的虚拟环境中,并使其在命令行中全局可用。
适用场景: 安装Python命令行工具或应用程序(如代码格式化工具、构建工具等),这些工具需要在系统范围内可访问,但其依赖不应与系统Python冲突。
对于那些已经被打包到Linux发行版仓库中的Python库,最安全和推荐的方式是使用系统包管理器(如apt)进行安装。
使用方法:
sudo apt install python3-your-package-name
适用场景: 当您需要安装一个系统范围内的Python库,并且该库已经有对应的发行版包时。这种方式由系统维护,可以保证与系统其他组件的兼容性。
虽然虚拟环境和pipx解决了项目隔离和应用程序管理的问题,但有些用户可能仍然希望拥有一个“全局”的用户级Python环境,可以自由安装任何包,并且默认使用最新版本的pip和Python,而不受系统Python的限制。在这种情况下,第三方Python版本管理工具(如pyenv、conda或miniforge)提供了更强大的解决方案。
这些工具通过在用户主目录中安装和管理多个独立的Python版本,彻底将用户环境与系统环境分离。用户可以轻松切换不同版本的Python,并在每个版本下自由安装包,就像在PEP 668之前的系统上使用--user一样。
pyenv是一个轻量级的Python版本管理工具,它允许您轻松安装、切换和管理多个Python版本。
1. 安装pyenv:
在Ubuntu上,您可以通过以下命令安装必要的依赖并克隆pyenv仓库:
sudo apt update sudo apt install -y build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git clone https://github.com/pyenv/pyenv.git ~/.pyenv
配置环境变量: 将以下行添加到您的~/.bashrc、~/.zshrc或相应的shell配置文件中,然后source该文件或重启终端:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\nfi' >> ~/.bashrc echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
2. 安装Python版本:
使用pyenv install命令安装您需要的Python版本。例如,安装Python 3.11.8:
pyenv install 3.11.8
您可以运行pyenv install --list查看所有可安装的版本。
3. 设置默认Python版本:
pyenv global 3.11.8
cd my_project_directory pyenv local 3.11.8
4. 验证与使用:
设置完成后,您会发现python和pip命令指向了pyenv管理的版本,而不是系统版本。
$ which python /home/john/.pyenv/shims/python $ which pip /home/john/.pyenv/shims/pip
现在,您可以在这个pyenv管理的Python环境中自由使用pip install安装任何包,而不会遇到“externally-managed-environment”错误,因为这个Python环境完全由pyenv管理,独立于系统。
pip install requests
适用场景: 追求极致自由和灵活性的开发者,需要频繁切换Python版本,或希望拥有一个完全独立于系统、可自由定制的“用户级”Python环境。
PEP 668的引入标志着Python包管理进入了一个新时代,强调了环境隔离的重要性。面对这一变化,我们有多种策略来管理Python包:
虽然错误提示中提到了--break-system-packages选项,但强烈建议避免使用,因为它可能导致系统Python环境损坏,进而影响系统的稳定性和功能。选择上述推荐的任一方法,都能在保证系统安全的前提下,高效地管理您的Python环境。
以上就是如何在PEP 668时代高效管理用户级Python环境的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号