我有一个用 Python 编写的实用程序,我曾经使用过它,现在需要再次使用它。
它是作为我安装的包和带有 shebang 的可执行脚本完成的,该脚本将被导入并调用 main 函数。
使用方式与其他语言中的任何其他实用程序一样。只需调用包装模块主调用的可执行文件即可。
但是将 Ubuntu 从 22.04 更新到 24.04 后,当我尝试使用 pip 在系统范围内安装软件包时,我收到 PEP-668 定义的以下消息:
$ /usr/bin/python3 -m pip install -U --user -e ./
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.12/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.
我设法使用 APT 包等效项 (python-xyz) 安装依赖项,但对于安装我自己的包,这不起作用。
我不习惯 venvs,但在使用它之前它们需要额外的步骤,例如激活环境等,我无法与系统范围的可用脚本协调。我可以选择 Python 二进制文件来运行 shebang 中的脚本,但这就是我认为我能做的。
那么,在 PEP-668 之后,如何创建一个在系统范围内运行的应用程序,可以从 shell 或
.desktop
XDG 应用程序条目调用,而无需编写本地 Debian(或任何其他操作系统)包?
详细信息:相关应用程序是开源的,可以在这里找到:https://github.com/AllanDaemon/uchoose
编辑: 像上面那样使用 pip 和
--break-system-packages
以及其他技巧,对我来说确实有效。但这似乎太hackish了。也许这是这种情况的理想解决方案,但我感觉这并不理想。
/usr/bin/python3 -m pip install --break-system-packages -U --user ./
使用
venv
创建系统范围内的 Python 安装将是最简洁的方法。
使用管理员用户拥有的位置(例如
/opt/venv
)是一个好主意。以专用用户身份管理 venv
的优点是无需以 root 身份运行模块安装。
然后您想要使用此
venv
的脚本可以将位置硬编码在shebang行中,例如
#!/opt/venv/bin/python
或者我的偏好是在
/opt/venv/bin
开头使用 $PATH
修改用户环境,以便您可以使用更灵活的:
#!/usr/bin/env python
或者,如果您从包中安装这些脚本,那么使用 Python 包管理来创建 可执行脚本 是最好的主意,并且避免在脚本中使用 shebang 行。
创建
venv
的步骤可能如下所示:
root# python3 -m venv /opt/venv
root# chown -R venv_admin:venv_admin /opt/venv
root# su - venv_admin
venv_admin$ export PATH=/opt/venv/bin:$PATH
venv_admin$ pip install --upgrade pip wheel
venv_admin$ pip install some_awesome_package