Erro de instalação do python-dev: ImportError: Nenhum módulo chamado apt_pkg

100

Sou um usuário Debian e quero instalar o python-dev, mas quando executo o código no shell como root:

# aptitude install python-dev

Eu obtenho o seguinte erro:

Traceback (most recent call last):       
  File "/usr/bin/apt-listchanges", line 28, in <module>
    import apt_pkg
ImportError: No module named apt_pkg

Qual parece ser o problema e como posso resolvê-lo?

Belphegor
fonte
1
parece que seu apt ist está quebrado, o que acontece quando você tenta apt-get install python-dev
Pierre Geier
Quando tento com apt-get install python-dev, ele diz que já está instalado: Lendo listas de pacotes ... Concluído Construindo árvore de dependências Lendo informações de estado ... Concluído python-dev já é a versão mais recente. 0 atualizado, 0 recém-instalado, 0 para remover e 0 não atualizado. Alguma outra sugestão?
Belphegor

Respostas:

64

Certifique-se de ter um pacote python-apt funcionando. Você pode tentar remover e instalar esse pacote novamente para corrigir o problema com apt_pkg.so não ser localizado.

apt-get install python-apt
Arnestig
fonte
Já está instalado. Quando eu clico em: # apt-get install python-apt ele me dá Lendo listas de pacotes ... Concluído Construindo árvore de dependências Lendo informações de estado ... Concluído python-apt já é a versão mais recente. 0 atualizado, 0 recém-instalado, 0 para remover e 0 não atualizado. E quando eu tento novamente com: # aptitude install python-dev Ele me dá o mesmo erro novamente. Algumas outras idéias o que devo fazer?
Belphegor
14
remova-o usando apt-get remove --purge python-apte instale-o novamente
Arnestig
8
Esteja ciente de outras dependências. Eu removi o pacote (também) rapidamente no Ubuntu e muitas outras dependências foram removidas também (por exemplo, ubuntu-desktop). No entanto, é minha culpa não prestar atenção às notas do diário.
Al R.
1
Não tenho certeza se foi devido ao python-apt. Olhe em packages.ubuntu.com/lucid/ubuntu-desktop para dependências do ubuntu-desktop.
Arnestig
3
@Arnestig REMOVER python-aptparece bastante perigoso !! Aprendi minha lição uma vez e não vou tentar.
alvas de
143

Eu conheci esse problema ao fazer sudo apt-get update. Meu env é debian8, com python2.7 + 3.4 (padrão) + 3.5.

O código a seguir recriará apenas um apt_pkg....soarquivo para python 3.5

sudo apt-get install python3-apt --reinstall

O código a seguir resolveu meu problema,

cd /usr/lib/python3/dist-packages
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so

Portanto, obviamente, o python3-apt verifica a versão mais recente do python, em vez da versão atual do python em uso.

zhazha
fonte
29
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.sodeve ser alterado para sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so
desaiankitb
39
Você é incrível! Para mim, era sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.sopara o python3.6, e esse bug horrível acabou.
Alex Gurrola
56
Depois de instalar o Python 3.7 ao lado do padrão 3.6 no Ubuntu 18.04 com sudo apt install python3.7que eu tenho esse erro apt_pkg tentando executar pip, então eu precisava para executar cd /usr/lib/python3/dist-packages, em seguida, sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.soem seguida sudo apt install python3-pip.
abulka
3
para python 3.6, o comando serásudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
StatguyUser
1
Essas chaves não são propriedade do comando ln. Eles invocam a expansão de chave de shell, consulte gnu.org/software/bash/manual/html_node/Brace-Expansion.html
Carlos A. Ibarra
116

Resolva assim:

/usr/lib/python3/dist-packages# cp apt_pkg.cpython-34m-i386-linux-gnu.so apt_pkg.so

Ou:

/usr/lib/python3/dist-packages# cp apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

Basicamente, se você conseguir um, No such file or directoryapenas lstente encontrar o nome certo.

user8178061
fonte
Funciona perfeitamente
Subhrajyoti Sen
3
No Ubuntu 18.04, use este $ cd / usr / lib / python3 / dist-packages $ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Naren Yellavula
Isso funcionou para mim também ... Listei todos os arquivos no /usr/lib/python3/dist-packages, e vi que não tinha apt_pkg.cpython-34m-i386-linux-gnu.soou apt_pkg.cpython-3m-i386-linux-gnu.so, mas tinha apt_pkg.cpython-36m-i386-linux-gnu.so... Copiei esse arquivo para apt_pkg.soe funcionou perfeitamente! Obrigado!
Leonardo Isso
Isso funcionou para mim também. Como @LeonardoIsso fez, também listei todos os arquivos para encontrar o nome de arquivo adequado porque estou no Linux de 32 bits.
w3Develops
66

Isso aconteceu comigo no Ubuntu 18.04.2 depois que tentei instalar o Python3.7 do repositório deadsnakes.

Solução foi esta

1) cd /usr/lib/python3/dist-packages/

2) sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Mirror Mirage
fonte
3
Só queria confirmar aos outros que isso realmente funcionou para mim.
AnthonyD973
2
isso é loucura, obrigado! Quando no docker:RUN ln -s /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.so
loretoparisi
2
Sim, essa foi a solução :)
szedjani
1
esta é a solução! Depois de atualizar para o python 3.7.
JOHN
1
18.04.04, atualizando para python 3.7 e funcionou para mim também! Obrigado!!
RJaus
22

Este erro geralmente ocorre quando uma versão mais recente do python foi instalada junto com uma versão mais antiga, por exemplo;

  • Ubuntu 18.04.1 vem com python versão 3.6.6
  • Ppa instalado: deadsnakes / python3.7.1 ou alternativa
  • Execute um comando que usa o módulo apt_pkg e obtenha um erro como;

        from CommandNotFound.db.db import SqliteDatabase
    File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
        import apt_pkg
    

Quando instalamos uma versão não distro python3 com apt, ele irá definir um diretório de módulo compartilhado para ser o de python3 mais geralmente será /usr/lib/python3.

Na maioria das vezes isso vai ficar bem, mas em algumas circunstâncias as diferentes versões do python dependem de diferentes bibliotecas ou objetos / bibliotecas compartilhados do que a outra versão do python, portanto, como outras respostas apontaram, precisamos vincular o versão correta do python. Portanto, se tivermos o python3.6 instalado em um sistema de 64 bits, o link apt_pkg .SO seria

sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Mas o problema reside no fato de que quando instalamos uma versão mais recente do python, o link será atualizado para apontar para a versão mais recente do python, o que leva ao erro do módulo apt_pkg não ser encontrado. Ao verificar qual versão do python vem com sua distribuição, você pode criar o link conforme mostrado acima. Ou usamos um método para oferecer ao comando uma escolha de versões de python para vincular o .SO, como;

sudo ln -s apt_pkg.cpython-{36m,35m,34m}-x86_64-linux-gnu.so apt_pkg.so

Como o python criará este link para a versão mais recente instalada do python, damos ao comando a opção de escolher entre 3 versões do python, das quais ele escolherá a versão mais recente fornecida.

Jamie Lindsey
fonte
2
Executando 18.04.2, sua primeira recomendação funcionou para mim e eu pude finalmente executar o sudo apt-get update sem erros. Sua segunda recomendação retornou um erro dizendo que apt-get.so não era uma pasta.
CloseISQ
16

A solução do @ user8178061 funcionou bem mas fiz algumas modificações para a minha versão que é python3.7com Ubuntu

Eu substituí o apt_pkg.cpython-3m-i386-linux-gnu.soporapt_pkg.cpython-36m-x86_64-linux-gnu.so

Aqui estão os dois comandos a serem executados:

cd /usr/lib/python3/dist-packages

sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

Hugo Sohm
fonte
1
Isso resolveu meu problema. Isso resolve o problema se for causado pela troca da versão Python 3.6 para 3.7.
jumbot
1
Obrigado, tive o mesmo problema! Considere usar sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.sopara que apt_pkg.sofique claro o que é.
Scipio
Funcionou, mas tive que mudar para sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.sopor algum motivo
Daniel
10

Isso funcionou para mim depois de atualizar o python3.7 no ubuntu18.04

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
Astha
fonte
1
Isso funcionou para mim após a atualização do python 3.8 no ubuntu18.04.
Henry Palacios
6

Por algum motivo, minha instalação estava faltando apt_pkg.sono diretório dist-packages do python3. ( apt_pkg.cpython-33m-x86_64-linux-gnu.soestava lá ?!) mas e eu tive que fazer um link simbólico apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so em/usr/lib/python3/dist-packages

Não tenho certeza se minha atualização foi quebrada ou por que isso aconteceu. Ocorreu após tentar atualizar (preciso-> raring-> atualização quântica)

Jamie Pate
fonte
Esta foi a correção correta para mim. Eu causei esse problema usando pip3 como root, embora soubesse que era uma má ideia. Eu queria ver o quanto ficaria chocado se colocasse meu dedo em uma tomada de luz. A resposta é: muito ruim. Além disso, mexer com a configuração de / etc / alternative não é para o coração. Não para quem é um visitante em tempo parcial. Acho que cruzar qual link python apontava para qual python era o problema que me levou ao desastre.
pauljohn32
6
  1. Verifique sua versão padrão do Python 3:
python --version
Python 3.7.5
  1. cdem /usr/lib/python3/dist-packagese verificar os apt_pkg.*arquivos. Você verá que não há nenhum para sua versão padrão do Python:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. Crie o link simbólico:
sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64- linux-gnu.so 
Nico Schlömer
fonte
5

O último recurso é sudo cp /usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so se o lncomando for demais para você ou, de alguma forma, magicamente não funcionar.

cpacima também pode ser mvse você se dedicar apenas a usar uma versão do Python.

Tong Niu
fonte
5

se você estiver usando o python 3.7, faça o downgrade para o python 3.6 atualizando o Alternatives, isso funcionou para mim

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1

sudo update-alternatives --config python3
Viren Patel
fonte
Isso funcionou para mim com python3.6, mas quando eu volto para python3.7, o erro ainda está lá
Hugo Sohm
3

Se você estiver usando o python 3.5, faça downgrade para o 3.4. Esse é o movimento mais seguro a fazer.

Abaixo /usr/lib/python3/dist-packagesvocê verá *34m*qual python 3.5 não pode usar. zhazha answer symlink para ele.

Pobe
fonte
como você faz o downgrade?
Pynchia
por que o rebaixamento é a ação mais segura?
David Medinets de
3

Além de fazer um link simbólico para apt_pkg.so, você pode querer fazer apt_inst.soda mesma maneira de apt_pkg.so.

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 
Parque Jihwan
fonte
3

Eu vejo todo mundo dizendo como consertar isso com cópias estranhas etc, mas ninguém disse realmente porque o problema ocorre.

Então, deixe-me explicar, para aqueles de vocês que gostam de mim, não querem mexer nos arquivos do sistema apenas porque alguém no SO disse isso a eles.


O problema é que:

  • muitos scripts de sistema têm python3 codificado dentro deles. Você mesmo pode verificar:
~$ grep -R "\#\!/usr/bin/python3" /usr/lib/*

/usr/lib/cnf-update-db:#!/usr/bin/python3
/usr/lib/command-not-found:#!/usr/bin/python3
/usr/lib/cups/filter/pstotiff:#!/usr/bin/python3
/usr/lib/cups/filter/rastertosag-gdi:#!/usr/bin/python3 -u
grep: /usr/lib/cups/backend/cups-brf: Permission denied
/usr/lib/cups/backend/hpfax:#!/usr/bin/python3
/usr/lib/language-selector/ls-dbus-backend:#!/usr/bin/python3
/usr/lib/python3/dist-packages/language_support_pkgs.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/installdriver.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/openprinting.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/xmldriverprefs.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/smburi.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/ppds.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/cupshelpers/debug.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/DistUpgrade/dist-upgrade.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/CommandNotFound/db/creator.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/CommandNotFound/db/db.py:#!/usr/bin/python3
/usr/lib/python3/dist-packages/Quirks/quirkreader.py:#!/usr/bin/python3
grep: /usr/lib/ssl/private: Permission denied
/usr/lib/system-service/system-service-d:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/check-new-release-gtk:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/do-partial-upgrade:#!/usr/bin/python3
/usr/lib/ubuntu-release-upgrader/check-new-release:#!/usr/bin/python3
/usr/lib/update-notifier/package-data-downloader:#!/usr/bin/python3
/usr/lib/update-notifier/backend_helper.py:#!/usr/bin/python3
/usr/lib/update-notifier/apt_check.py:#!/usr/bin/python3
/usr/lib/update-notifier/apt-check:#!/usr/bin/python3

  • python apt package python-apt/ python3-apté um pacote de sistema, então é para sistema padrão python

Assim, os scripts sempre obterão a versão atualmente vinculada python3, mas falham porque o pacote apt não está presente.


Solução geral: NUNCA altere o python3link padrão . Sempre. Isso também se aplica ao pythonlink - se um aplicativo foi escrito em Python2 com alguns elementos de sintaxe antigos que não funcionam no Python3, o aplicativo não funcionará.

[Meu terminal quebrou dessa forma porque eu uso o Terminator, que aparentemente foi escrito em Python2.7 e não é compatível com Python3.]


As soluções apresentadas aqui sugerem copiar / vincular os arquivos do pacote apt ou alterar o python3link.

Vamos analisar ambos:

  1. Copiando / vinculando o pacote apt

Isso não deve ser um problema porque em torno do Python3.4 todos os scripts Python funcionam em versões mais recentes também.

Tão longe. Mas pode quebrar no futuro - se você mantiver o sistema por tempo suficiente.

  1. Alterando o python3link de volta

Esta é uma ótima solução porque podemos voltar a "nunca alterar o link"


"Mas eu gosto de ter que digitar apenas python!" - Eu gosto disso também! Foi assim que cheguei a esse problema em primeiro lugar!

  1. Em geral, você deve evitar alterar manualmente os links do sistema - use em update-alternativesvez disso para vincular versões diferentes . Isso se aplica a qualquer aplicativo com muitas versões. Isso ainda quebrará os scripts do sistema (porque muda o link), mas você pode alternar facilmente, sem se preocupar se colocou link e dest na ordem certa ou cometeu um erro de digitação.

  2. Considere usar outro nome que não seja python/ python3para o seu link ou alias.

  3. Ou adicione seu próprio python/ python3link ao PATH (assim como os ambientes virtuais fazem), sem alterar os links do sistema.

h4z3
fonte
muito útil para novos usuários de python.
Hassan Ajaz
0

Windows 10 WSL v1 (Ubuntu 16.04.6 LTS)

Esta resposta do reddit (ligeiramente modificada funcionou para mim)

sudo ln -sfn /usr/lib/python3/dist-packages/apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

Leo Furze-Waddock
fonte
0

Nenhuma das respostas funcionou para mim (estou usando Ubuntu 16.04 e Python 3.6). Então, finalmente resolvi o problema da seguinte maneira:

1- conectar ao FTP do servidor

2- vá para a pasta "/ usr / lib / python3 / dist-packages /"

3- duplique o arquivo "apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so"

4- renomeie este arquivo duplicado para "apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so"

É isso aí!

Julio S.
fonte
0

Estou no Ubuntu 16.04 e atualizei para Python 3.7. Aqui está o erro que eu tive ao tentar adicionar um PPA

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test                                           
Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 11, in <module>
    from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
  File "/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py", line 27, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Consegui corrigir esse erro criando um link simbólico com meu apt_pkg.cpython-34m-x86_64-linux-gnu.so inicial do python 3.4, criando o seguinte link simbólico

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so
GigaWatts
fonte
1
Parece que esta solução já foi proposta em pelo menos 6 outras respostas a esta questão (e mais 3 apenas sugeridas para copiar o arquivo ao invés de symlinking).
Sergey Shubin
isso simplesmente funciona para mim, obrigado! Uma coisa é antes que precisamos cd / usr / lib / python3 / dist-packages
Hao Yellow
-3

Tente corrigir isso definindo as variáveis ​​de local:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"
rajendra sharma
fonte
1
Tente ser mais específico e explicar o que esses dois comandos estão fazendo.
dpapadopoulos de
-5

Caso isso ajude outro, finalmente resolvi esse problema, que aparentemente foi causado por conflitos de versão do python, redirecionando o link python3 e, em seguida, redirecionando-o para a versão correta do python:

sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.4

Pode ser necessário inserir a versão correta do Python, encontrada com:

python3 -V
matthias2t
fonte
2
remover python3 é uma má ideia :( se você quiser um link para python 3.4, use: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda
1
Nunca é uma boa ideia dizer às pessoas para removerem coisas de seu sistema, a menos que seja realmente necessário. Felizmente, / usr / bin / python3 normalmente é apenas um link simbólico de qualquer maneira. Eu realmente acho que você deveria apenas deletar esta resposta.
Jamie Lindsey