命令:
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.
型
我希望有人能告诉我该怎么做以及如何解决这个问题。
8条答案
按热度按时间33qvvth11#
这是因为您的发行版采用了PEP 668 – Marking Python base environments as “externally managed”。
TL;DR:使用venv:
字符串
说来话长:您的发行版试图保护您避免混合使用
apt
提供的软件包和pip
提供的软件包。混合使用两个软件包管理器(这里是apt
和pip
)总是一个坏主意,也是许多问题的根源。PEP 668是分发版明确告诉用户避免陷入这种陷阱的一种方式。您的分发版在消息中告诉您三种解决方案,但只有第二种完全适用于您的用例:
apt install python3-xxx
。它并不完全适用于你,因为你有一个requirements.txt
,而不是一个单一的依赖项。如果你在文件中只有几个需求,并且可以手动为每个需求做它,就像apt install python3-xxx python3-yyy python3-zzz
一样。在这种情况下,没有奇怪的包管理器混合:你使用apt
安装了python3
,你使用apt
安装了你的依赖项:没有什么奇怪的。python3 -m venv .venv
,然后source .venv/bin/activate
,然后pip install -r requirements.txt
。在这种情况下,安装包含在.venv
目录中:没有apt和pip的混合,没有惊喜。pipx
并不完全适用于您的情况,pipx
适合安装和使用程序,如pipx install black
,但在这里您需要安装需求文件中列出的库,而不是程序。还有另一种方法,我经常自己使用,因为我经常需要多个不同的Python版本:
apt
安装的东西,也不会采用PEP 668
。我经常使用a short bash function自己编译许多Python解释器,这些解释器使用--prefix=~/.local/
,用于测试目的。对于那些Python,我使用venv或者旧的pip install
,在这种情况下,pip
将把它安装在~/.local/
中,同样,apt
和pip
之间没有冲突,没有坏的意外。dtcbnfnu2#
在
pip
的末尾使用--break-system-packages
。这将在您的本地用户目录
~/.local/lib/python3.11
中安装软件包。字符串
fbcarpbf3#
将以下内容添加到您的 ~/.config/pip/pip.conf 文件中:
字符串
如果你想了解更多,你可以点击这里。
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安装的python1.使用
get-pip.py
安装pip:hiz5n14c5#
用途:
字符串
r3i60tvu6#
字符串
2ekbmq327#
虽然公认的答案对于常规的Python使用是正确的,但我错过了关于Docker的部分。正如in this answer很好地解释的那样,许多人没有在Docker中使用venv,因为它没有真正的价值,因为容器根据定义提供了一个隔离的环境。
正如在PEP-668本身中提到的,删除文件标记可能是可以的:
因此,基本容器映像的构建者可能希望确保标记文件不存在,即使底层操作系统默认提供了一个标记文件。
然而,我觉得使用venv仍然是一种更好的方法,如果你需要在Dockerfile中进行更改,为什么不以正确的方式进行呢?
字符串
zed5wv108#
消息已经传递了解决方案:
字符串
试试这个:
型
对我很有效。