Quero instalar alguns pacotes Python pandasql
em todo o sistema, em um sistema Devuan (ou Debian). Está no Índice de Pacotes Python, mas - não parece haver um pacote (dpkg) para ele; vamos supor que realmente não exista.
Agora, se eu tentar pip install pandasql
, recebo uma mensagem sugerindo que eu use um ambiente virtual:
× 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.
... mas ambientes virtuais não são o que eu quero fazer: quero instalar foo
em todo o sistema. Como eu posso fazer isso?
Notas :
- Se possível, responda de forma mais geral do que apenas em relação a
pandasql
? - Devuan Excalibur (~= Debian Trixie), Python 3.11.6, máquina x86_64
O fato de o Debian não permitir que você faça isso vem de algum lugar:
pip
instalações em todo o sistema são, por design, incompatíveis com instalações python gerenciadas pelo sistema. O próprio Pip reconheceu que quando degrada--system
as instalações de "padrão" para "o usuário precisa especificá-lo e esperançosamente sabe o que está fazendo". O Debian sabe exatamente que você quebrará as coisas dessa maneira, então ele não fornece um softwarepip
que permitirá que você faça isso.Chega de teoria ( mais informações ) de por que o Debian impede você de fazer isso.
Agora para a prática:
Então, você precisa fazer o que
pip install --system pandasql
faz, mas de uma forma segura e compatível com o Debian, que também não quebre tudo quando qualquer dependência for atualizada. Isso inclui inferir os nomes dos pacotes Debian das dependências do pacote pip e fazer com que, se as dependências mudarem, você não fique com um pacote disfuncional.Para pouca surpresa, a maneira Debian de instalar software são os pacotes Debian. Eles podem ser atualizados, têm uma lista de dependências,
dpkg
garantem que não sobrescrevam os arquivos uns dos outros e podem ser desinstalados de forma limpa. Resumindo, eles, do ponto de vista de todo o sistema, são melhores quepip
os pacotes. Você quer isto!Existe um pequeno programa auxiliar que faz o trabalho pesado para você;
sudo apt install pypi2deb
; não é difícil de usar:Se a última etapa falhar
error: Unmet build dependencies
, isso lhe dirá o que você precisa instalar para progredir. No meu caso:Deixe a instalação ser executada e tente uma segunda vez
Isso funcionou!
Agora você tem um pacote instalável
package_pandasql/result/
e pode instalá-lo usandosudo apt install ./result/python3-pandasql*.deb
.Como foi observado, há boas razões pelas quais o pip não permite mais instalar pacotes em todo o sistema, mas também tenho esse caso de uso gerenciando software para um grande número de usuários que podem ter acesso à mesma máquina e esperam que o software "simplesmente funcione" sem precisar ter conhecimento de desenvolvedor para configurar o software.
Quando os usuários tentam instalar coisas por conta própria, muitas versões diferentes são instaladas, algumas delas são atualizadas, mas outras não, e situações do tipo "funciona para mim, mas não para todos". Também usamos muito espaço em disco por ter cópias independentes de pacotes grandes para cada usuário.
Uma solução que atualmente funciona para mim no debian:bookworm é instalar pacotes para um usuário e grupo especial, chamado
python-global
, e então permitir que outros usuários herdem os pacotes desse usuário manipulando aPYTHONPATH
variável.A instalação de um pacote é semelhante a:
E
/etc/profile.d/python-global.sh
lá está este código:Embora isso às vezes possa resultar em conflito com um pacote do sistema, é relativamente fácil para um usuário desativá-lo limpando a
PYTHONPATH
variável, se necessário. Ou eles podem definir__SOURCED_PYTHON_GLOBAL__
por conta própria.profile
para evitar as alterações.Talvez você precise fazer trabalho adicional, pois
/etc/profile.d
não é fornecido automaticamente, dependendo do seu gerenciador de login. Pode ser necessário criar uma cópia/etc/X11/Xsession.d/
também.Se usar o sinalizador descrito como "quebrar seu sistema" deixa você nervoso, você provavelmente poderá substituir
--break-system-packages
aqui por um ambiente virtual adequado de propriedade dopython-global
usuário. O ambiente virtual só precisa ser configurado uma vez e todos os usuários usam o mesmo ambiente virtual.