pip não detecta pacotes instalados pelo usuário após atualizar o python do sistema?

1

Eu uso Python no meu PC Fedora KDE (x64). Eu costumava ter o Fedora 25, e tinha instalado o Python 3.5 usando sudo dnf install python3 e vários pacotes como numpy e scipy usando comandos como sudo dnf install python3-numpy . Agora nem todos os pacotes ou versões adequados estavam disponíveis nos repositórios do fedora, por isso só eu instalei em ~/.local/lib/python3.5/site-packages/ via pip3 install <packagename> --user .

Avanço rápido, e eu atualizei o Fedora para a versão 28, durante a qual python3 foi atualizado para a versão 3.6. Todos os outros pacotes python3-* também foram adequadamente atualizados. Agora o pip3 não reconhece nenhum pacote instalado pelo usuário como em pip3 list --user , não retornando nenhuma saída. Mas o diretório ~/.local/lib/python3.5/site-packages/ ainda existe e tem vários pacotes.

Agora não tenho certeza do que devo fazer ....

  • Eu posso talvez deletar o conteúdo de site-packages , se eu soubesse exatamente o que pode ser deletado? Então eu posso começar a re-investigar quais pacotes realmente precisam ser instalados via pip agora.
  • posso renomear o ~/.local/lib/python3.5 para ~/.local/lib/python3.6
  • Alguma outra maneira de fazer o pip importar o conteúdo dos antigos pacotes python instalados pelo usuário?

Estou meio perdido em como proceder.

    
por Milind R 28.07.2018 / 12:30

1 resposta

0

Isso deve ser fácil se você ainda tiver o Python 3.5 por perto:

$ pip3.5 list --user --format=freeze | xargs pip3.6 install --user

irá reinstalar todos os pacotes do site do usuário para o Python 3.6. As coisas ficam um pouco mais complicadas quando a instalação antiga do Python se foi (portanto, não há pip3.5 no seu caso), mas ainda nada que você não possa gerenciar. Antes de mais nada, verifique se o site do usuário ainda existe para que você tenha algo com o que trabalhar:

$ find ~/.local -type d -name "site-packages" | grep python3.5
/Users/hoefling/.local/lib/python3.5/site-packages

Agora use pkg_resources para listar as distribuições disponíveis no site do usuário:

$ find ~/.local -type d -name "site-packages" | grep python3.5 | xargs python3.6 -c "import pkg_resources, sys; print(' '.join((f'{pkg.project_name}=={pkg.version}' for pkg in pkg_resources.find_distributions(sys.argv[1]))))"
wheel==0.30.0

O diretório do site do usuário será canalizado para a linha de código do Python que varrerá o diretório usando a função pkg_resources.find_distributions (consulte Obtendo ou criando distribuições seção nos documentos) que é o mesmo que pip usa sob o capô, IIRC. Acabei de adicionar alguma formatação para que você possa passar a saída para o novo pip3.6 na última iteração de estender o one-liner. O one-liner completo é:

$ find ~/.local -type d -name "site-packages" | grep python3.5 | xargs python3.6 -c "import pkg_resources, sys; print(' '.join((f'{pkg.project_name}=={pkg.version}' for pkg in pkg_resources.find_distributions(sys.argv[1]))))" | xargs pip3.6 install --user

pkg_resources é parte do pacote setuptools e já deve estar pré-instalado (pelo menos é o caso quando usamos os instaladores de link ). Caso contrário, instale setuptools primeiro:

$ dnf install python3-setuptools
    
por 01.08.2018 / 22:33