当 apt 没有对应的软件包时,在 Debian/Devuan 上安装 Python 软件包

当 apt 没有对应的软件包时,在 Debian/Devuan 上安装 Python 软件包

我想pandasql在 Devuan(或 Debian)系统上安装一些系统范围内的 Python 软件包。它在 Python 包索引中,但是 - 似乎没有它的 (dpkg) 包;让我们假设实际上不存在。

现在,如果我尝试这样做pip install pandasql,我会收到一条消息,建议我使用虚拟环境:

× 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.

...但是虚拟环境不是我想要做的:我想在foo系统范围内安装。我怎样才能做到这一点?

笔记:

  • 如果可能的话,请更笼统地回答,而不仅仅是关于pandasql
  • Devuan Excalibur (~= Debian Trixie)、Python 3.11.6、x86_64 机器

答案1

Debian 不允许你这样做的事实确实来自某个地方:pip系统范围的安装按照设计与系统管理的 python 安装不兼容。皮普自己已经认识到当它将--system安装从“默认”降级为“用户需要指定它并希望知道他们在做什么”时。 Debian 清楚地知道您会以这种方式破坏事物,因此它没有提供pip允许您这样做的软件。

理论就这么多(更多背景)为什么 Debian 阻止你这样做。

现在进行练习:

我能做些什么?

因此,您需要做的事情pip install --system pandasql是,但要以 Debian 兼容的、安全的方式进行,这样在更新任何依赖项时也不会破坏所有内容。这包括从 pip 包推断依赖项的 Debian 包名称,并确保在依赖项发生变化时,您不会留下功能失调的包。

毫不奇怪,Debian 安装软件的方式是 Debian 软件包。它们可以更新,它们有一个依赖项列表,dpkg确保它们不会覆盖彼此的文件,它们可以被干净地卸载。总而言之,从整个系统的角度来看,它们比pip包更好。你想要那个!

有一个小帮助程序可以为您完成这项艰苦的工作;sudo apt install pypi2deb;使用起来并不难:

mkdir package_pandasql
cd package_pandasql
# Try an initial build
py2dsp --build pandasql

如果最后一步失败并显示error: Unmet build dependencies,这将告诉您需要安装什么才能继续。就我而言:

sudo apt install python3-all python3-numpy python3-pandas python3-setuptools python3-sqlalchemy

让安装运行并再次尝试

py2dsp --build pandasql

成功了!

现在您在 中有一个可安装的包package_pandasql/result/,您可以使用 来安装它sudo apt install ./result/python3-pandasql*.deb

答案2

正如已经指出的,pip 不再允许您在系统范围内安装软件包是有充分理由的,但我也为大量可能有权访问同一台计算机并期望软件“正常工作”的用户提供了这个用例管理软件无需开发人员具备设置软件的知识。

当用户尝试自己安装时,会导致安装许多不同的版本,其中一些版本得到更新,但另一些则没有,以及“它适用于我,但不适用于其他所有人”的情况。我们还为每个用户提供大型软件包的独立副本,从而使用大量磁盘空间。

目前在 debian:bookworm 中对我有用的解决方案是为名为 的特殊用户和组安装软件包python-global,然后允许其他用户通过操作PYTHONPATH变量来继承该用户的软件包。

安装包看起来像:

sudo -u python-global python3 -m pip install <x> --break-system-packages

里面/etc/profile.d/python-global.sh有这样的代码:

if [ -z "${__SOURCED_PYTHON_GLOBAL__}" ]; then
    export PYTHONPATH="/home/python-global/python-packages/:$PYTHONPATH";
    export PATH="/home/python-global/.local/bin/:$PATH";
    export __SOURCED_PYTHON_GLOBAL__=1;
fi;

虽然这有时仍可能导致与系统包发生冲突,但用户可以相对轻松地通过清除PYTHONPATH变量(如果需要)来禁用它。或者他们可以__SOURCED_PYTHON_GLOBAL__自行设置.profile以避免更改。

您可能需要做额外的工作,因为/etc/profile.d不会自动获取,具体取决于您的登录管理器。您可能/etc/X11/Xsession.d/还需要创建一个副本。

如果使用描述为“破坏系统”的标志让您感到紧张,您可以将此处替换--break-system-packages为用户拥有的适当虚拟环境python-global。虚拟环境只需设置一次,每个用户都使用相同的虚拟环境。

相关内容