Error de instalación de python-dev: ImportError: ningún módulo llamado apt_pkg

95

Soy un usuario de Debian y quiero instalar python-dev, pero cuando ejecuto el código en el shell como root:

# aptitude install python-dev

Obtuve el siguiente error:

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

¿Cuál parece ser el problema y cómo puedo resolverlo?

Belphegor
fuente
1
parece que su apt está roto, ¿qué sucede cuando intenta apt-get install python-dev?
Pierre Geier
Cuando intento con apt-get install python-dev, dice que ya está instalado: Leyendo listas de paquetes ... Listo Construyendo árbol de dependencias Leyendo información de estado ... Listo python-dev ya es la versión más nueva. 0 actualizado, 0 recién instalado, 0 para eliminar y 0 no actualizado. ¿Cualquier otra sugerencia?
Belphegor

Respuestas:

63

Asegúrese de tener un paquete python-apt que funcione. Puede intentar quitar e instalar ese paquete nuevamente para solucionar el problema con apt_pkg.so que no se encuentra.

apt-get install python-apt
Arnestig
fuente
Ya está instalado. Cuando presiono: # apt-get install python-apt me da Leyendo listas de paquetes ... Listo Construyendo árbol de dependencias Leyendo información de estado ... Listo python-apt ya es la versión más nueva. 0 actualizado, 0 recién instalado, 0 para eliminar y 0 no actualizado. Y cuando lo intento de nuevo con: # aptitude install python-dev Me da el mismo error nuevamente. Algunas otras ideas, ¿qué debo hacer?
Belphegor
14
eliminarlo usando apt-get remove --purge python-apte instalarlo de nuevo
Arnestig
8
Tenga en cuenta otras dependencias. Eliminé el paquete (demasiado) rápidamente en Ubuntu y también se eliminaron muchas otras dependencias (por ejemplo, ubuntu-desktop). Sin embargo, es mi culpa por no prestar atención a las notas del registro.
Al R.
1
No estoy muy seguro de si se debió a python-apt. Busque en packages.ubuntu.com/lucid/ubuntu-desktop las dependencias de ubuntu-desktop.
Arnestig
2
@Arnestig ¡¡ELIMINAR python-aptsuena bastante peligroso !! Aprendí mi lección una vez y no la intentaré.
alvas
140

Me encontré con este problema al hacer sudo apt-get update. Mi env es debian8, con python2.7 + 3.4 (predeterminado) + 3.5.

El siguiente código solo volverá a crear un apt_pkg....soarchivo para python 3.5

sudo apt-get install python3-apt --reinstall

El siguiente código resolvió mi problema,

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

Entonces, obviamente, python3-apt verifica la versión de Python más alta, en lugar de la versión de Python actual en uso.

zhazha
fuente
27
sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.sodebería cambiarse a sudo ln -s apt_pkg.cpython-{35m,34m}-x86_64-linux-gnu.so apt_pkg.so
desaiankitb
38
¡Eres fabuloso! Para mí, fue sudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.sopara python3.6, y este horrible error ya no existe.
Alex Gurrola
54
Después de instalar Python 3.7 al lado del defecto 3.6 en Ubuntu 18.04 con sudo apt install python3.7conseguí este error apt_pkg intentar ejecutar pip, por lo que necesitaba para funcionar cd /usr/lib/python3/dist-packagesentonces sudo ln -s apt_pkg.cpython-{36m,37m}-x86_64-linux-gnu.soa continuación sudo apt install python3-pip.
abulka
3
para Python 3.6, el comando serásudo ln -s apt_pkg.cpython-{35m,36m}-x86_64-linux-gnu.so
StatguyUser
1
Esas llaves no son propiedad del comando ln. Invocan la expansión del refuerzo de shell, consulte gnu.org/software/bash/manual/html_node/Brace-Expansion.html
Carlos A. Ibarra
113

Resuélvelo con esto:

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

O:

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

Básicamente, si obtiene un No such file or directorysolo lspara intentar obtener el nombre correcto.

user8178061
fuente
Funciona perfectamente
Subhrajyoti Sen
3
En 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
Esto también funcionó para mí ... Hice una lista de todos los archivos en el /usr/lib/python3/dist-packages, y vi que no tenía apt_pkg.cpython-34m-i386-linux-gnu.soo apt_pkg.cpython-3m-i386-linux-gnu.so, pero tenía apt_pkg.cpython-36m-i386-linux-gnu.so... ¡Copié este archivo apt_pkg.soy funcionó perfectamente! ¡Gracias!
Leonardo Isso
Esto funcionó para mí también. Como hizo @LeonardoIsso, también enumeré todos los archivos para encontrar el nombre de archivo correcto porque estoy en Linux de 32 bits.
w3 Se desarrolla el
59

Esto me sucedió en Ubuntu 18.04.2 después de que intenté instalar Python3.7 desde el repositorio de deadsnakes.

La solución fue esta

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

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

Espejismo Espejo
fuente
3
Solo quería confirmar a los demás que esto realmente funcionó para mí.
AnthonyD973
2
eso es una locura, gracias! When in 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
Sí, esa fue la solución :)
szedjani
1
esta es la solucion! Después de actualizar a Python 3.7.
JOHN
1
18.04.04, actualizando a Python 3.7 ¡y esto también funcionó para mí! ¡¡Gracias!!
RJaus
18

Este error suele ocurrir cuando se instala una versión más nueva de Python junto con una versión anterior, por ejemplo;

  • Ubuntu 18.04.1 se envía con la versión 3.6.6 de Python
  • Ppa instalado: deadsnakes / python3.7.1 o alternativo
  • Ejecute un comando que use el módulo apt_pkg y obtenga un error como;

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

Cuando instalamos una versión de python3 que no es de distribución con apt, se configurará un directorio de módulo compartido para que sea el de python3 /usr/lib/python3.

La mayoría de las veces esto estará bien, pero en algunas circunstancias las diferentes versiones de Python se basan en bibliotecas u objetos / bibliotecas compartidas diferentes a las de la otra versión de Python, por lo que, como han señalado otras respuestas, debemos vincular el .SO versión correcta de Python. Entonces, si tenemos python3.6 instalado en un sistema de 64 bits, entonces el enlace apt_pkg .SO sería

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

Pero el problema radica en el hecho de que cuando instalamos una versión más nueva de Python, el enlace se actualizará para apuntar a la versión más nueva de Python, lo que conduce al error de no encontrar el módulo apt_pkg. Al verificar qué versión de Python se envía con su distribución, puede crear el enlace como se muestra arriba. O usamos un método para ofrecer al comando una opción de versiones de Python para vincular el .SO como;

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

Debido a que Python creará este enlace a la versión más reciente de Python instalada, le damos al comando la opción de elegir entre 3 versiones de Python, de las cuales elegirá la versión más alta dada.

Jamie Lindsey
fuente
2
Ejecutando 18.04.2, su primera recomendación funcionó para mí y finalmente pude ejecutar la actualización sudo apt-get sin errores. Su segunda recomendación devuelve un error que dice que apt-get.so no era una carpeta.
CloseISQ
15

La solución de @ user8178061 funcionó bien pero lo hice con algunas modificaciones para mi versión que es python3.7con Ubuntu

Reemplacé el apt_pkg.cpython-3m-i386-linux-gnu.soconapt_pkg.cpython-36m-x86_64-linux-gnu.so

Aquí los dos comandos a ejecutar:

cd /usr/lib/python3/dist-packages

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

Hugo Sohm
fuente
1
Esto solucionó mi problema. Esto resuelve el problema si fue causado por cambiar la versión de Python de 3.6 a 3.7.
JThistle
1
Gracias, tuve el mismo problema! Considere usarlo sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.sopara que quede claro qué apt_pkg.soes.
Scipio
Funcionó, pero tuve que cambiarlo sudo cp apt_pkg.cpython-37m-x86_64-linux-gnu.so apt_pkg.sopor alguna razón
Daniel
8

Esto funcionó para mí después de actualizar python3.7 en ubuntu18.04

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
astha
fuente
1
Esto funcionó para mí después de actualizar Python 3.8 en ubuntu18.04.
Henry Palacios
6

Por alguna razón, mi instalación faltaba apt_pkg.soen el directorio dist-packages de python3. (¿ apt_pkg.cpython-33m-x86_64-linux-gnu.sohabía ?!) pero tuve que hacer un enlace simbólico apt_pkg.so -> apt_pkg.cpython-33m-x86_64-linux-gnu.so en/usr/lib/python3/dist-packages

No estoy seguro de si mi actualización se rompió o por qué fue así. Ocurrió después de intentar actualizar (precisa-> rara-> actualización cuántica)

Jamie Paté
fuente
Esta fue la solución correcta para mí. Cause este problema usando pip3 como root, aunque sabía que era una mala idea. Quería ver cuánto me sorprendería si metía el dedo en un enchufe de luz. La respuesta es: bastante mala. También jugar con la configuración de / etc / alternativas no es para los más débiles. No para cualquiera que sea un visitante a tiempo parcial. Creo que cruzar el enlace de Python apuntaba a qué Python era un problema que me llevó al desastre.
pauljohn32
6
  1. Verifique su versión predeterminada de Python 3:
python --version
Python 3.7.5
  1. cden /usr/lib/python3/dist-packagesy comprobar los apt_pkg.*archivos. Verá que no hay ninguno para su versión predeterminada de Python:
ll apt_pkg.*
apt_pkg.cpython-36m-x86_64-linux-gnu.so
  1. Crea el enlace 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
fuente
5

Un último recurso es 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 si el lncomando es demasiado para ti o si de alguna manera mágicamente no funciona.

cplo anterior también puede serlo mvsi solo está dedicado a usar una versión de Python.

Tong Niu
fuente
4

si está usando Python 3.7 degradarlo a Python 3.6 actualizando Alternativas, esto funcionó para mí

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

sudo update-alternatives --config python3
Viren Patel
fuente
Esto funcionó para mí con python3.6 pero cuando vuelvo a python3.7, el error sigue ahí
Hugo Sohm
3

Si está usando Python 3.5, baje a 3.4. Ese es el movimiento más seguro que se puede hacer.

A continuación /usr/lib/python3/dist-packages, verá *34m*qué Python 3.5 no puede usar. zhazha responde enlace simbólico.

Pobe
fuente
¿Cómo lo rebajas?
Pynchia
¿Por qué la degradación es la actina más segura?
David Medinets
3

Además de hacer un enlace simbólico para apt_pkg.so, es posible que desee hacerlo apt_inst.sode la misma manera apt_pkg.so.

ln -s apt_inst.cpython-35m-x86_64-linux-gnu.so apt_inst.so 
Parque Jihwan
fuente
1

Veo a todos diciendo cómo solucionarlo con copias extrañas, etc., pero nadie dijo realmente por qué ocurre el problema.

Permítanme explicarles, para aquellos de ustedes que como yo no quieren meterse con los archivos del sistema solo porque alguien en SO se lo dijo.


El problema es ese:

  • muchos scripts del sistema tienen python3 shebang codificado en ellos. Puedes comprobarlo tú mismo:
~$ 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-aptes un paquete del sistema, por lo que es para el sistema predeterminado python

Por lo tanto, los scripts siempre obtendrán la versión actualmente vinculada python3, pero fallarán porque el paquete apt no está presente.


Solución general: NUNCA cambie el python3enlace predeterminado . Siempre. Esto también se aplica al pythonenlace: si una aplicación se escribió en Python2 con algunos elementos de sintaxis antiguos que no funcionan en Python3, la aplicación no funcionará.

[Mi terminal se rompió de esa manera porque uso Terminator, que aparentemente está escrito en Python2.7 no es compatible con Python3].


Las soluciones presentadas aquí sugieren copiar / vincular los archivos del paquete apt o cambiar el python3enlace.

Analicemos ambos:

  1. Copiar / vincular el paquete apt

Esto no debería ser un problema porque desde Python3.4 todos los scripts de Python también funcionan en versiones más nuevas.

Hasta aquí. Pero puede romperse en el futuro, si mantiene su sistema el tiempo suficiente.

  1. Cambio de python3enlace de nuevo

Esta es una gran solución porque podemos volver a "nunca cambiar el enlace"


"¡Pero me gusta tener que escribir solo python!" - ¡A mí también me gusta! ¡Así fue como llegué a este problema en primer lugar!

  1. En general, debe evitar cambiar manualmente los enlaces del sistema; utilice update-alternativesen su lugar para vincular diferentes versiones . Esto se aplica a cualquier aplicación con muchas versiones. Esto aún romperá esos scripts del sistema (porque cambia el enlace), pero puede cambiar de un lado a otro fácilmente, sin preocuparse de si puso el enlace y dest en el orden correcto o si cometió un error tipográfico.

  2. Considere usar otro nombre que no sea python/ python3para su enlace o alias.

  3. O agregue su propio python/ python3enlace a PATH (como lo hacen los entornos virtuales), sin cambiar los enlaces del sistema.

h4z3
fuente
0

Windows 10 WSL v1 (Ubuntu 16.04.6 LTS)

Esta respuesta de reddit (ligeramente modificada funcionó para mí)

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

Leo Furze-Waddock
fuente
0

Ninguna de las respuestas me funcionó (estoy usando Ubuntu 16.04 y Python 3.6). Así que finalmente resolví el problema de la siguiente manera:

1- conéctate al FTP del servidor

2- ve a la carpeta "/ usr / lib / python3 / dist-packages /"

3- duplica el archivo "apt_pkg.cpython-3 5 m-x86_64-linux-gnu.so"

4- cambie el nombre de este archivo duplicado a "apt_pkg.cpython-3 6 m-x86_64-linux-gnu.so"

¡Eso es!

Julio S.
fuente
0

Estoy en Ubuntu 16.04 y actualizado a Python 3.7. Aquí está el error que tuve al intentar agregar un 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'

Pude corregir este error haciendo un enlace simbólico con mi python 3.4 inicial apt_pkg.cpython-34m-x86_64-linux-gnu.so creando el siguiente enlace simbólico

sudo ln -s apt_pkg.cpython-34m-x86_64-linux-gnu.so apt_pkg.so
Gigavatios
fuente
1
Parece que esta solución ya se propuso en al menos otras 6 respuestas a esta pregunta (y 3 más solo se sugirieron para copiar el archivo en lugar de realizar enlaces simbólicos).
Sergey Shubin
esto simplemente funciona para mí, ¡gracias! Una cosa es antes que necesitamos cd / usr / lib / python3 / dist-packages
Hao Yellow
-3

Intente solucionar este problema configurando las variables de configuración regional:

export LC_ALL="en_US.UTF-8"

export LC_CTYPE="en_US.UTF-8"
rajendra sharma
fuente
1
Intente ser más específico y explique qué están haciendo estos dos comandos.
dpapadopoulos
-5

En caso de que ayude a otro, finalmente resolví este problema, que aparentemente fue causado por conflictos de versiones de Python, redirigiendo el enlace python3 y luego redirigiéndolo a la versión correcta de Python:

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

Es posible que deba ingresar la versión correcta de Python, que se encuentra con:

python3 -V
matthias2t
fuente
2
eliminar python3 es una mala idea :( si desea un enlace a Python 3.4, use: ln -s /usr/bin/python3.4 / usr / bin / python3
Pamungkas Jayuda
1
Nunca es una buena idea decirle a la gente que elimine cosas de su sistema a menos que sea realmente necesario. Afortunadamente, / usr / bin / python3 normalmente es solo un enlace simbólico de todos modos. Realmente creo que deberías eliminar esta respuesta.
Jamie Lindsey