答案1
pipx
对阵pip
pipx
(在隔离环境中安装并运行 Python 应用程序)并不是一个平等的替代方案pip
(Python 软件包安装程序) ... 它的使用pip
和工作方式也不同... 它隔离所下载的应用程序/软件包... 因此,它们不会在该隔离环境之外提供给系统 Python... 它为所安装的每个应用程序创建一个单独的虚拟环境... 但是,其主要目的是使 Python 应用程序能够作为控制台/终端中命令行的常规命令运行,而不是使它们可用(可导入)到你的 Python 解释器。
然而,这(使用pip
Python3 模块):
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
上面描述的方法进行安装。
创建和使用虚拟环境其实并不是那么困难,无论是在脚本中还是在终端中......请看例如:
- 除了系统 Python 之外,如何安装一个干净版本的 Python?(即不附带一堆无法卸载的软件包)
- 使用 /usr/bin/env python3 指向 22.04 中的虚拟环境
- 如何启动 gnome-terminal 并激活 python 虚拟环境?
笔记:还有另一种选择,将这两个选项都传递--user --break-system-packages
给pip
它,这将强制安装包...这虽然仅限于用户环境,但并不被认为是安全的,并且可能仍然会按照它所说的去做,--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