导入使用 pipx 安装的 python 包

导入使用 pipx 安装的 python 包

我想使用排箫在一些 Python 代码中打包,如下所示:import panflute。如果可以避免的话,我不想每次运行该代码时都启动虚拟环境。(显然,这是一个 Pandoc 过滤器。)

我试过了$ sudo apt install python3-panflute,但没有这样的包。然后我尝试使用点点。这样就安装了 panflute,但是我收到“ModuleNotFoundError:没有名为‘panflute’的模块”错误。

我认为通过 pipx 安装应该使包可以作为模块导入,这是错误的吗?我错过了什么步骤吗?

我正在使用 Ubuntu 23.04。

答案1

pipx对阵pip

pipx在隔离环境中安装并运行 Python 应用程序)并不是一个平等的替代方案pipPython 软件包安装程序) ... 它的使用pip和工作方式也不同... 它隔离所下载的应用程序/软件包... 因此,它们不会在该隔离环境之外提供给系统 Python... 它为所安装的每个应用程序创建一个单独的虚拟环境... 但是,其主要目的是使 Python 应用程序能够作为控制台/终端中命令行的常规命令运行,而不是使它们可用(可导入)到你的 Python 解释器。

然而,这(使用pipPython3 模块):

python3 -m pip install -U panflute

在系统范围内运行(不建议)或在虚拟环境中(首选) 应该安装并更新该包,以便它可以被解释器导入。

Ubuntu 23.04+

也就是说,你正在使用Ubuntu 23.04包括后续版本) 禁止安装系统范围的 Python 软件包(默认情况下) 通过 Python 包管理器等进行分发pip,并交给 APT 等发布包管理器来遵守PEP 668 – 将 Python 基础环境标记为“外部管理”... 尝试使用时,您应该会看到类似这样的错误消息pip包括其他 Python 包管理器)安装系统范围的(即在虚拟环境之外) 包裹:

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.

但是,建议的包命名如下:

To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.

仅仅是一个建议,并不一定意味着该软件包已经在 Ubuntu 官方存储库中可用...因此,您应该先使用以下命令确认其可用性:

$ apt search python3-panflute
Sorting... Done
Full Text Search... Done

不幸的是,如您所见,该软件包尚未可用(至少从官方存储库来看)。

解决方法

安装尚未通过 APT 提供的 Python3 软件包的最佳选择(通常以名称python3-packagename),方法是在您创建的 Python3 虚拟环境中执行此操作,并使用pip上面描述的方法进行安装。

创建和使用虚拟环境其实并不是那么困难,无论是在脚本中还是在终端中......请看例如:

笔记:还有另一种选择,将这两个选项都传递--user --break-system-packagespip它,这将强制安装包...这虽然仅限于用户环境,但并不被认为是安全的,并且可能仍然会按照它所说的去做,--break-system-packages所以也不建议。

答案2

我是否错误地认为通过 pipx 安装应该使包可以作为模块导入?

是的,这样想是错误的。(我知道这听起来很刺耳,我无意无礼,我只是想给你一个明确而直接的答案。)pipx 的全部目的是让你安装 Python 应用程序 - 即,你可以在命令行上输入命令来运行 Python 程序,或者以任何其他通常的方式运行程序 -没有允许从其他代码导入这些包。

老实说,我强烈建议你使用虚拟环境。我知道你说你不想,但无论你认为你有什么理由避免虚拟环境,我高度毫无疑问,这是做你想做的事情的最佳方式。如果你正在开发一款软件,你可能会发现使用为您管理虚拟环境。(顺便说一句,我建议使用 pipx 来安装 tox。)

答案3

我认为通过 pipx 安装应该使包可以作为模块导入,这是错误的吗?我错过了什么步骤吗?

pipx用于安装应用程序,而不是管理开发环境。它实际上在后台创建了一个虚拟环境来支持此用例,这就是为什么它不会对系统的其余部分产生影响。如果您尝试进行开发工作,则需要不同的工具。

如果可以避免的话,我不想每次运行该代码时都启动虚拟环境。

除非你可以通过系统包管理器获取这些包,否则你无法避免使用 Python 时出现这种情况。可能是某个包含排箫的 PPA,但我的猜测可能不是。

话虽如此,处理这个问题并不困难,有很多方法可以以透明的方式处理这个问题。“经典”方法是编写一个简短的 shell 脚本,在您需要运行它的虚拟环境中运行该程序(这实际上是一个三行脚本,第一行只是让#!/bin/sh内核将其识别为 shell 脚本的必需行)。

或者,查看诗歌,它可以帮您轻松处理大部分问题,并且在您所获得的功能之上添加了一些显着改进的依赖管理工具pip。您可以通过运行以下命令在 Ubuntu 22.04 及更高版本中安装 python3-poetry:

sudo apt install python3-poetry

相关内容