¿Qué es el ImportError "Número mágico malo" en Python y cómo lo soluciono?
Lo único que puedo encontrar en línea sugiere que esto se debe a compilar un archivo .py -> .pyc y luego intentar usarlo con la versión incorrecta de python. En mi caso, sin embargo, el archivo parece importarse bien algunas veces pero no otras, y no estoy seguro de por qué.
La información que proporciona Python en el rastreo no es particularmente útil (es por eso que estaba preguntando aquí ...), pero aquí está en caso de que ayude:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Respuestas:
El número mágico proviene de sistemas de tipo UNIX donde los primeros bytes de un archivo contenían un marcador que indica el tipo de archivo.
Python coloca un marcador similar en sus
pyc
archivos cuando los crea.Luego, el intérprete de Python se asegura de que este número sea correcto al cargarlo.
Cualquier cosa que dañe este número mágico causará su problema. Esto incluye editar el
pyc
archivo o intentar ejecutar un archivopyc
desde una versión diferente de python (generalmente más tarde) que su intérprete.Si son sus
pyc
archivos, simplemente elimínelos y deje que el intérprete vuelva a compilar lospy
archivos. En los sistemas de tipo UNIX, eso podría ser algo tan simple como:o:
Si no son suyos, tendrá que obtener los
py
archivos para volver a compilarlos o un intérprete que pueda ejecutar lospyc
archivos con ese valor mágico en particular.Una cosa que podría estar causando la naturaleza intermitente. Lo
pyc
que está causando el problema solo puede importarse bajo ciertas condiciones. Es muy poco probable que importe algunas veces. ¿Debe verificar el seguimiento real de la pila completa cuando falla la importación?Como comentario aparte, la primera palabra de todos mis
2.5.1(r251:54863)
pyc
archivos es62131
,2.6.1(r261:67517)
es62161
. La lista de todos los números mágicos se puede encontrar enPython/import.c
, reproducida aquí para completar (actual como en el momento en que se publicó la respuesta, puede haber cambiado desde entonces):fuente
Eliminar todos los archivos .pyc solucionará el error "Número mágico incorrecto".
fuente
find . -name "*.pyc" -delete
, ya que tendrá problemas con los espacios (y posiblemente con una línea de comando demasiado larga) si expande todos los nombres de archivo para pasarrm
.find . -name "*.pyc" -print
y solo luego eliminar manualmente los archivos problemáticos y / o ejecutar el comando anterior, después de verificar que no está haciendo algo lamentable.Cargar un
*.pyc
archivo generado por python3 con python2 también causa este error.fuente
Lleva el archivo pyc a una máquina con Windows. Use cualquier editor hexadecimal para abrir este archivo pyc. Utilicé el freeware 'HexEdit'. Ahora lea el valor hexadecimal de los primeros dos bytes. En mi caso, estos fueron 03 f3.
Abra calc y convierta su modo de visualización a Programmer (Scientific en XP) para ver la conversión Hex y Decimal. Seleccione "Hex" del botón de radio. Ingrese los valores como el segundo byte primero y luego el primer byte, es decir, f303 Ahora haga clic en el botón de opción "Dec" (Decimal). El valor que se muestra es uno que corresponde al número mágico, también conocido como versión de python.
Entonces, considerando la tabla proporcionada en la respuesta anterior
fuente
El error "Número mágico incorrecto" también ocurre si ha nombrado manualmente su archivo con una extensión .pyc
fuente
Tuve un extraño caso de error Bad Magic Number usando una implementación muy antigua (1.5.2). Generé un archivo .pyo y eso provocó el error. Curiosamente, el problema se resolvió cambiando el nombre del módulo. El nombre ofensivo era sms.py. Si generé un sms.pyo a partir de ese módulo, el resultado fue un error de Bad Magic Number. Cuando cambié el nombre a smst.py, el error desapareció. Revisé de un lado a otro para ver si sms.py de alguna manera interfería con algún otro módulo con el mismo nombre, pero no pude encontrar ninguna colisión de nombres. Aunque la fuente de este problema seguía siendo un misterio para mí, recomiendo probar un cambio de nombre del módulo.
fuente
Esto también puede deberse a que falta un
__init__.py
archivo del directorio. Digamos que si crea un nuevo directorio en django para separar las pruebas unitarias en varios archivos y los coloca en un directorio, entonces también debe crear el__init__.py
archivo junto a todos los demás archivos en el nuevo directorio de prueba creado. de lo contrario, puede dar un error comoTraceback (most recent call last): File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python35\Lib\unittest\loader.py",line 153, in loadTestsFromName module = __import__(module_name) ImportError: bad magic number in 'APPNAME.tests': b'\x03\xf3\r\n'
fuente
Esto es mucho más eficiente que el anterior.
donde
{directory-of-.pyc-files}
está el directorio que contiene los archivos compilados de python.fuente
find /dir -name "*.pyc" -exec rm '{}' ';'
En mi caso, no fueron
.pyc
sino viejos.mo
archivos de traducción binaria después de cambiar el nombre de mi propio módulo, por lo que dentro de esta carpeta del módulo tuve que ejecutar(haga una copia de seguridad e intente arreglar los
.pyc
archivos primero)fuente
Esto también puede suceder si tiene el archivo python27.dll incorrecto (en el caso de Windows), para resolver esto simplemente reinstale (o extraiga) python con la versión dll correspondiente. Yo tuve una experiencia similar.
fuente
Acabo de enfrentar el mismo problema con Fedora26, donde muchas herramientas como dnf se rompieron debido a un número mágico malo para seis. Por una razón desconocida, tengo un archivo /usr/bin/six.pyc, con el número mágico inesperado. Eliminar este archivo soluciona el problema
fuente
En mi caso, tengo
git clone
una biblioteca que tenía un intérprete deMientras
python
conducía aPython2.7
pesar de que mi código principal se estaba ejecutando con python3.6 ... todavía creó un*.pyc
archivo para la2.7
versión ...Puedo decir que este error probablemente sea el resultado de una mezcla entre las versiones 2.7 y 3+, es por eso que la limpieza (de cualquier forma que se te ocurra que estás usando), ayudará aquí ...
fuente
¡No los elimines! Hasta..........
Encuentre una versión en su carpeta git, svn o copy que funcione.
Elimínelos y luego recupere todo .pyc.
Eso es trabajo para mi.
fuente
*.pyc
archivos?Deberá ejecutar este comando en cada ruta que tenga en su entorno.
Luego ejecute el comando en cada directorio aquí
fuente