我想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
。虚拟环境只需设置一次,每个用户都使用相同的虚拟环境。