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

ruarlubt  于 11个月前  发布在  Linux
关注(0)|答案(8)|浏览(305)

命令:

pip install -r requirements.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.


我希望有人能告诉我该怎么做以及如何解决这个问题。

33qvvth1

33qvvth11#

这是因为您的发行版采用了PEP 668 – Marking Python base environments as “externally managed”
TL;DR:使用venv

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt

字符串
说来话长:您的发行版试图保护您避免混合使用apt提供的软件包和pip提供的软件包。混合使用两个软件包管理器(这里是aptpip)总是一个坏主意,也是许多问题的根源。
PEP 668是分发版明确告诉用户避免陷入这种陷阱的一种方式。您的分发版在消息中告诉您三种解决方案,但只有第二种完全适用于您的用例:

  • 使用apt install python3-xxx。它并不完全适用于你,因为你有一个requirements.txt,而不是一个单一的依赖项。如果你在文件中只有几个需求,并且可以手动为每个需求做它,就像apt install python3-xxx python3-yyy python3-zzz一样。在这种情况下,没有奇怪的包管理器混合:你使用apt安装了python3,你使用apt安装了你的依赖项:没有什么奇怪的。
  • 使用venv:python3 -m venv .venv,然后source .venv/bin/activate,然后pip install -r requirements.txt。在这种情况下,安装包含在.venv目录中:没有apt和pip的混合,没有惊喜。
  • 使用pipx并不完全适用于您的情况,pipx适合安装和使用程序,如pipx install black,但在这里您需要安装需求文件中列出的库,而不是程序。

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

  • 使用你的发行版没有提供的Python,所以它不会弄乱apt安装的东西,也不会采用PEP 668。我经常使用a short bash function自己编译许多Python解释器,这些解释器使用--prefix=~/.local/,用于测试目的。对于那些Python,我使用venv或者旧的pip install,在这种情况下,pip将把它安装在~/.local/中,同样,aptpip之间没有冲突,没有坏的意外。
dtcbnfnu

dtcbnfnu2#

pip的末尾使用--break-system-packages
这将在您的本地用户目录~/.local/lib/python3.11中安装软件包。

pip install xyz --break-system-packages

字符串

fbcarpbf

fbcarpbf3#

将以下内容添加到您的 ~/.config/pip/pip.conf 文件中:

[global]
break-system-packages = true

字符串
如果你想了解更多,你可以点击这里。

omvjsjqw

omvjsjqw4#

在升级到Ubuntu 23.04(Lunar Lobster)后,我在pyenv内部遇到了这个错误。作为这次升级的一部分,系统Python也从3.10升级到了3.11。重新安装pyenv没有帮助。我不得不:
1.删除所有通过which pip发现的pip示例(还有sudo which pip,因为它一直指向.pyenv/shims,root用户没有安装pyenv)
1.使用pyenv global <version>切换到任何pyenv安装的python
1.使用get-pip.py安装pip:

wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
rm get-pip.py
hiz5n14c

hiz5n14c5#

用途:

sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED

字符串

r3i60tvu

r3i60tvu6#

sudo rm /usr/lib/python3.*/EXTERNALLY-MANAGED

字符串

2ekbmq32

2ekbmq327#

虽然公认的答案对于常规的Python使用是正确的,但我错过了关于Docker的部分。正如in this answer很好地解释的那样,许多人没有在Docker中使用venv,因为它没有真正的价值,因为容器根据定义提供了一个隔离的环境。
正如在PEP-668本身中提到的,删除文件标记可能是可以的:
因此,基本容器映像的构建者可能希望确保标记文件不存在,即使底层操作系统默认提供了一个标记文件。
然而,我觉得使用venv仍然是一种更好的方法,如果你需要在Dockerfile中进行更改,为什么不以正确的方式进行呢?

# Assuming somewhere on top there is already `python3-venv` installed 
# via system package manager, e.g. `apt-get install -y python3-venv`

RUN python3 -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# Below you can continue using `pip install` as normal

字符串

zed5wv10

zed5wv108#

消息已经传递了解决方案:

× 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.

字符串
试试这个:

sudo apt install python3-<package>


对我很有效。

相关问题