<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="Python的虚拟环境">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2024-03-29 09:41<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:
Python的虚拟环境


在运行pip3 install命令时候出现了下面的错误提示




XML/HTML代码


    error: externally-managed-environment  

      

    &times; This environment is externally managed  

    ╰─&gt; 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.  




出现以上错误提示，可以在虚拟环境中解决




XML/HTML代码


    python3 -m venv .venv

    source .venv/bin/activate




然后再运行pip install或者pip3 install安装程序就可以正常进行了。


或者使用  --break-system-packages 选项来强制安装。注意，这可能会导致一些依赖关系丢失或破坏，应该谨慎使用。


--break-system-packages选项的作用是告诉pip忽略当前环境的外部管理，并强制安装Python包到当前环境中。这对于在特定环境中管理Python包非常有用，比如虚拟环境或用户级别的Python包管理。




XML/HTML代码


    pip install --break-system-packages -r  requirements.txt




 其他方案：


pip(3) install，完美解决 externally-managed-environment




现象


在 Manjaro 22、Ubuntu 23.04、Fedora 38 等最新的linux发行版中运行pip install时，通常会收到一个错误提示：error: externally-managed-environment，即&ldquo;外部管理环境&rdquo;错误，但这不是一个 bug。


如果您想阅读，这是完整的错误信息：




XML/HTML代码


    $ sudo pip3 install please-cli  

    error: externally-managed-environment  

    &times; This environment is externally managed  

    ╰─&gt; To install Python packages system-wide, try 'pacman -S  

        python-xyz', where xyz is the package you are trying to  

        install.  

        If you wish to install a non-Arch-packaged Python package,  

        create a virtual environment using 'python -m venv path/to/venv'.  

        Then use path/to/venv/bin/python and path/to/venv/bin/pip.  

        If you wish to install a non-Arch packaged Python application,  

        it may be easiest to use 'pipx install xyz', which will manage a  

        virtual environment for you. Make sure you have python-pipx  

        installed via pacman.  

    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. 







原因


&ldquo;外部管理环境&rdquo;错误背后的原因：Manjaro 22、Ubuntu 23.04、Fedora 38 以及其他的最新发行版中，正在使用 Python 包来实现此增强功能。


这个更新是为了避免「操作系统包管理器 (如pacman、yum、apt) 和 pip 等特定于 Python 的包管理工具之间的冲突」。


这些冲突包括 Python 级 API 不兼容和文件所有权冲突。


更多详情可以在官方查看：PEP 668 &ndash; Python base environments


解决方案


方案一、(粗暴) 去掉这个提示


强制删除此警告，回归到熟悉的操作。


将 &ldquo;x&rdquo; 替换为实际版本。


XML/HTML代码


    sudo mv /usr/lib/python3.x/EXTERNALLY-MANAGED /usr/lib/python3.x/EXTERNALLY-MANAGED.bk





注意python版本号写你自己的别直接抄，不知道到底是多少可以进/user/lib看看：




XML/HTML代码


    find /usr/lib/ -type d -name &quot;*python*&quot;







和之前一样，现在您可以直接运行 pip(3) install package_name 命令来安装python模块。


方案二、(推荐) 使用pipx


您在上面看到的涉及手动工作。Pipx 使其自动化。


它会自动为您安装的每个应用程序创建一个新的虚拟环境。不仅。它还在 中创建指向它的链接.local/bin。这样，安装该软件包的用户就可以从命令行中的任何位置运行它。


我想这就是大多数桌面 Linux 用户想要的。


使用以下命令在 Ubuntu 上安装 pipx：


XML/HTML代码


    sudo apt install pipx





它可能会安装大量的依赖项：


现在将其添加到 PATH 中，以便您可以从任何地方运行。


XML/HTML代码


    pipx ensurepath





提示：


您必须关闭终端并重新登录才能发生更改。


现在我们可以使用 Pipx 而不是 Pip 安装 Python 包：


pipx install package_name


提示：


要删除使用 pipx 安装的软件包，请使用 pipx uninstall package_name 命令。




XML/HTML代码


    pipx install cookiecutter

    pipx runpip cookiecutter install -r requirements.txt







方案三、(高阶) 使用venv


如果您是开发人员，


在运行或构建py文件时遇到如下图 ModuleNotFoundError: No module named 'xxx' 的错误，


推荐切换为该方案，即使用Python虚拟环境。


借助虚拟环境，您可以使用不同版本的包依赖项和Python。这样，您就可以避免包之间的任何冲突。


这种方法适合从事Python项目的软件开发人员和程序员。


XML/HTML代码


    安装 venv

    sudo apt install python3-venv

    #或

    sudo apt install python3.10-venv

    生成一个Python虚拟环境

    mkdir -p $HOME/.env &amp;&amp; python3 -m venv $HOME/.env/project_name





现在，您将看到一个.env在您的主目录中，并且在 .env 中，您将拥有项目目录。


每个虚拟环境项目目录中都会有自己的 Python 和 Pip 副本。


安装模块，如 algoliasearch


XML/HTML代码


    $HOME/.env/project_name/bin/python -m pip install --upgrade pip

    $HOME/.env/project_name/bin/python -m pip install algoliasearch





用新的虚拟环境执行py文件


XML/HTML代码


    source $HOME/.env/project_name/bin/activate

    $HOME/.env/project_name/bin/python ./demo.py





这只是 Python 虚拟环境的一个简短示例。如果您想了解更多信息，这里有一份详细指南。


Python Virtual Environments


在教程中，您将学习如何使用 Python 虚拟环境来管理 Python 项目。您还将深入了解使用 venv 模块构建的虚拟环境的结构，以及使用虚拟环境背后的原因环境背后的原因。


方案四、(其他) 使用原生包


据我所知，Pip 提供了一种安装 Python 包的舒适方法。然而，一些Python应用程序也打包为APT或其他本机包。在您的发行版存储库中搜索它并从那里安装它（如果可用）。


例如，我试图安装 WoeUSB-ng。如果我使用 Arch Linux，AUR 也提供相同的软件包。


结论


Pip 是一个在系统上获取 Python 包的好工具。个人认为它始终是为 Python 程序员设计的，而不是为最终用户设计的。显然它不能用作原生发行包的替代品，Python 开发人员已经明确表示了这一点。


当然最新的改动的好处是，程序员和最终用户都有替代方案。


</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
