pip install -rrequirements.txt 失败:“此环境由外部管理”

iRe*_*es 74 python linux

命令:

\n
pip install -r requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
error: externally-managed-environment\n\n\xc3\x97 This environment is externally managed\n\xe2\x95\xb0\xe2\x94\x80> To install Python packages system-wide, try apt install\npython3-xyz, where xyz is the package you are trying to\ninstall.\n\nIf you wish to install a non-Debian-packaged Python package,\ncreate a virtual environment using python3 -m venv path/to/venv.\nThen use path/to/venv/bin/python and path/to/venv/bin/pip. Make\nsure you have python3-full installed.\n\nIf you wish to install a non-Debian packaged Python application,\nit may be easiest to use pipx install xyz, which will manage a\nvirtual environment for you. Make sure you have pipx installed.\n\nSee /usr/share/doc/python3.11/README.venv for more information.\n\nnote: 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.\nhint: See PEP 668 for the detailed specification.\n
Run Code Online (Sandbox Code Playgroud)\n

我希望有人向我解释该怎么做以及如何解决它。

\n

Jul*_*ard 102

这是因为您的发行版采用PEP 668 \xe2\x80\x93 将 Python 基础环境标记为 \xe2\x80\x9cexternally Managed\xe2\x80\x9d

\n

TL;DR:使用venv

\n
python3 -m venv .venv\nsource .venv/bin/activate\npython3 -m pip install -r requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

长话短说:您的发行版试图防止您混合apt提供的包和pip提供的包。混合使用两个包管理器(apt以及pip此处)始终是一个坏主意,并且是许多问题的根源。

\n

PEP 668 是发行版明确告诉用户避免陷入此陷阱的一种方式。您的发行版在消息中告诉您三种解决方案,但只有第二个完全适用于您的用例:

\n
    \n
  • 使用apt install python3-xxx。它并不完全适合您,因为您有一个依赖项requirements.txt,而不是一个依赖项。如果文件中只有几个要求并且可以手动完成每个要求(例如apt install python3-xxx python3-yyy python3-zzz. 在这种情况下,包管理器没有奇怪的混合:您使用安装python3apt您正在使用安装依赖项apt:毫不奇怪。
  • \n
  • 使用 venv:python3 -m venv .venvthen source .venv/bin/activate,then pip install -r requirements.txt。在这种情况下,安装包含在.venv目录内:没有混合 apt 的功能和 pip 的功能,这并不奇怪。
  • \n
  • 使用pipxwhich 并不完全适用于您的情况,pipx可以很好地安装和使用程序,例如pipx install black,但在这里您需要安装需求文件中列出的库,而不是程序。
  • \n
\n

还有另一种方法,我自己经常使用,因为我经常需要多个不同的Python 版本:

\n
    \n
  • 使用您的发行版未提供的 Python,因此它不会弄乱apt已安装的东西,并且不采用PEP 668. 我经常使用一个简短的 bash 函数自己编译许多 Python 解释器,该函数使用--prefix=~/.local/, 来进行测试。对于这些Python,我使用 venv 或旧的pip install,在这种情况pip下将安装它,同样,和~/.local/之间没有冲突,没有什么不好的惊喜。aptpip
  • \n
\n

  • 我在升级到 Debian 12 后刚刚遇到了这个问题。我理解为什么这是一个很好的做法,但我不会说它不烦人。 (9认同)
  • `source` 是一个 bash 扩展。`.` 将在所有 shell 中工作。 (4认同)
  • *“我理解为什么这是一个很好的做法,但我不会说它不烦人。”* - 是的......被告知以正确的方式做这件事很烦人:-) (2认同)

ris*_*sar 31

--break-system-packages在 的末尾使用pip

这将在您的本地用户目录中安装软件包~/.local/lib/python3.11

pip install xyz --break-system-packages
Run Code Online (Sandbox Code Playgroud)

  • 当创建运行 python 应用程序的 Linux docker 容器时,这是完美的。在容器内创建 venv 是没有意义的。 (7认同)
  • 对于项目,建议使用 venv (2认同)
  • 这可能会消除症状,但有什么风险呢?“`--break-system-packages`”听起来很可怕。 (2认同)

小智 11

将其添加到您的~/.config/pip/pip.conf文件中:

[global]
break-system-packages = true
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多,可以点击这里

  • 这应该是这里的正确答案。问题是关于解决外部管理的Python错误。强迫每个人都使用新的 Python 方法并不是解决方案,而是一种哲学立场。我真的没想到事情会这么简单。我原以为你的回答不起作用,但你真的救了我的命。这肯定是 Python 开发人员近年来对该项目做出的最愚蠢的改变。我现在必须记住这一点,因为它完全破坏了 VS Code 上的所有包。 (5认同)