pip freeze lista os pacotes desinstalados através do pip, depois reinstalado através do Pacman

1

Porque eu ouvi dizer que é uma péssima idéia instalar pacotes através de pip ao invés de através de um gerenciador de pacotes, eu estou tentando identificar todos os pacotes que eu instalei através de pip que também são prontamente disponível nos repositórios oficiais do pacman . Nem todos são (eu entendo que posso explorar o AUR ou empacotá-los eu mesmo, mas por enquanto estou tentando ficar dentro dos repositórios oficiais), então estou deixando alguns deles instalados através de pip por enquanto, e migrando o restante para pacman .

Meu fluxo de trabalho (reconhecidamente primitivo) para fazer isso foi:

  1. %código%; escolha um pacote para migrar (essencialmente arbitrário)
  2. pip freeze | less (Se não for encontrado, aborte e tente novamente com um pacote diferente)
  3. pacman -Ss python-packagename
  4. sudo pip uninstall packagename
  5. Se sudo pacman -S python-packagename relatar conflitos de arquivos, repita as etapas 2 a 4 para todos os pacotes dependentes antes de tentar executar a nova etapa 5 no pacote de destino.

Isso funciona, na medida em que acredito que agora gerencio o pacote com êxito por meio de pacman - pacman lista arquivos que parecem corretos e também vi pacotes atualizados por pacman -Ql python-packagename , indicando que pacman assumiu a responsabilidade de atualizar os pacotes.

O problema, no entanto, é que pacman ainda lista os pacotes, mesmo que eles tenham sido explicitamente desinstalados por pip freeze .

Como exemplo, pip e pip freeze | grep pylint indicam que o pacote está instalado. Eu posso desinstalar com sucesso o pacote através de pacman -Qqe | grep pylint ou através de sudo pacman -Rs python-pylint .

Se eu fizer isso - desinstale o pacote por meio de sudo pip uninstall pylint ou por meio de pip - o pacote desaparecerá da lista pacman e pip freeze não encontrará mais nada. Se eu reinstalar o pacote por meio de pacman -Qqe , o pacote reaparecerá em pacman -S . Reinstalar o pacote através de pip freeze não solicita que reapareça em pip .

Desinstalar um pacote de pacman -Qqe executando pip e, em seguida, reinstalá-lo com o sinalizador sudo pip uninstall packagename (ou seja, --user ) faz com que pip install --user packagename não exiba o pacote, mas sudo pip freeze continue a exibi-lo . Reinstalar o pacote através de pip freeze faz com que reapareça nas duas listas.

Eu não acredito que essa pergunta seja uma duplicata do neste link ; Nessa pergunta, o usuário não pôde remover pacotes de pacman desinstalando-os e o problema foi rastreado em vários binários pip freeze .

Nesse caso, a desinstalação de um pacote por meio de pip a remove de pip e pip freeze e which pip têm a mesma saída: sudo which pip . Além disso, /usr/bin/pip e sudo pip freeze produzem a mesma saída.

No entanto, o teste proposto pela resposta aceita à questão acima mostra o que eu acredito ser um comportamento estranho. (No momento da execução do teste abaixo, pip freeze tinha sido desinstalado de pylint e reinstalado através de pip .)

$ python -c 'import pkg_name' &> /dev/null && echo installed || echo not installed
Using config file /home/[my user name]/.pylintrc
not installed

O pacote está realmente instalado - não apenas imprime a linha do arquivo de configuração, mas eu posso usar o pacote como normal ( pacman ). Não esperaria então que o teste imprimisse pylint foo.py ?

Para responder às minhas perguntas reais sobre esse problema:

  • O que posso fazer para verificar quais pacotes estão realmente instalados apenas por meio de installed e quais são "instalados" por meio de pip e pip ?
  • O que pode ser feito para corrigir o problema mais amplo: pacman tracking packages instalado por meio de pip ?
por ModelHX 16.05.2018 / 18:19

1 resposta

0

Eu escrevi um script python ( link gist ) que verifica todos os pacotes python se eles foram instalados com pacman .

instalação

Faça o download do script e torne-o executável:

$ wget https://gist.github.com/hoefling/314565368a66c308b4d7d407a3028cb7/raw/7b81553fa0a84b92a90fbaa0746482d0ec18516c/pip-query -O pip-query
$ chmod +x pip-query

uso

Veja um exemplo chamando-o em um contêiner do tipo de janela base/archlinux em que instalei python-pip e python-wheel :

$ ./pip-query
Package    Version Owner
---------- ------- -----------------
appdirs    1.4.3   python-appdirs
packaging  17.1    python-packaging
pip        9.0.1   python-pip
pyparsing  2.2.0   python-pyparsing
setuptools 39.2.0  python-setuptools
six        1.11.0  python-six
wheel      0.31.1  python-wheel

A saída se parece com a saída de pip list --format=columns , mas com uma coluna adicional Owner que imprime o nome do pacote do sistema que possui o pacote python.

Vamos testar com um pacote instalado diretamente com pip :

$ sudo pip install tqdm
...
$ ./pip-query
Package    Version Owner
---------- ------- -----------------
appdirs    1.4.3   python-appdirs
packaging  17.1    python-packaging
pip        9.0.1   python-pip
pyparsing  2.2.0   python-pyparsing
setuptools 39.2.0  python-setuptools
six        1.11.0  python-six
tqdm       4.23.4
wheel      0.31.1  python-wheel

A coluna Owner tem uma célula vazia em tqdm row, isso indica que tqdm não foi instalado por pacman . Desinstale tqdm com pip :

$ sudo pip uninstall -y tqdm

e instale-o com pacman :

$ pacman -S python-tqdm

instalação permanente

Se você quiser, coloque o arquivo pip-query em algum lugar no seu PATH , de preferência algo local como $HOME/.local/bin para chamá-lo como um executável adequado com

$ pip-query

adaptando para outros gerenciadores de pacotes

Deve ser muito fácil adaptar o script para uso com outros gerenciadores de pacotes, se você quiser. Por exemplo, se eu alterar ['pacman', '-Qqo', file] para ['qfile', '-q', file] , o script funcionará no Gentoo sem qualquer modificação adicional *. Se o gerenciador de pacotes não oferecer suporte à impressão de nome de pacote puro, extraia as informações relevantes da string out com regex ou o que for.

reinstalar lotes em lote com pacman

Você pode modificar pip-query ou seguir a filosofia Unix e escrever algum comando bash que faça a reinstalação para você. No entanto, você tem que lidar com várias sugestões feitas por pacman (como no exemplo abaixo) e implementar o caso quando nada foi sugerido. Aqui está minha tentativa humilde (não um especialista em bash):

$ ./pip-query | tail -n +3 | while read line ; do split=(${line}); \
> if [ "${#split[@]}" -eq "2" ]; then pkgname=${split[0]}; \
> echo -e "Suggestion: pip uninstall -y $pkgname && pacman -S $(pacman -Sspq $pkgname | tr '\n' ' ')"; \
> fi; done
Suggestion: pip uninstall -y tqdm && pacman -S python-tqdm python2-tqdm

Aprimore isso e você tem uma solução automatizada para reinstalar tarefas.

*: assumindo que app-portage/portage-utils foi criado.

    
por 29.05.2018 / 13:33