2009-02-05 12 views
217

¿Cuál es el "Número mágico malo" ImportError en python, y cómo lo arreglo?¿Cuál es el error de número mágico malo?

Lo único que puedo encontrar en línea sugiere que esto se debe a la compilación de un archivo .py -> .pyc y luego intentar usarlo con la versión incorrecta de python. En mi caso, sin embargo, el archivo parece importar bien algunas veces pero no otras, y no estoy seguro de por qué.

del pitón de suministro de información en el rastreo no es particularmente útil (que es por lo que estaba pidiendo aquí ...), pero aquí es en caso de que ayuda:

Traceback (most recent call last): 
    File "run.py", line 7, in <module> 
    from Normalization import Normalizer 
+0

¿Podría proporcionar el código en el que se está produciendo el problema? –

+0

¿Y qué versión de python estás usando? – paxdiablo

+0

¿Y la normalización es uno de sus archivos o uno de terceros? – paxdiablo

Respuesta

270

El número mágico viene de Sistemas de tipo UNIX donde los primeros bytes de un archivo contenían un marcador que indicaba el tipo de archivo.

Python pone un marcador similar en sus archivos pyc 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 archivo pyc o tratar de ejecutar un pyc desde una versión diferente de python (generalmente más tarde) que su intérprete.

Si son sus pyc archivos, simplemente eliminarlos y dejar que el intérprete de volver a compilar los archivos py. En los sistemas de tipo UNIX, que podría ser algo tan simple como:

rm *.pyc 

o:

find . -name '*.pyc' -delete 

Si ellos no son los suyos, que tendrá que o bien obtener los archivos py para re-compilación, o un intérprete que puede ejecutar los archivos pyc con ese valor mágico particular.

Una cosa que podría estar causando la naturaleza intermitente. El pyc que está causando el problema solo se puede importar bajo ciertas condiciones. Es muy poco probable que se importe a veces. ¿Debería verificar el seguimiento de la pila completa cuando falla la importación?

Como acotación al margen, la primera palabra de todos mis archivos es pyc2.5.1(r251:54863)62131, 2.6.1(r261:67517) es 62161. La lista de todos los números mágicos se puede encontrar en Python/import.c, reproducido aquí para completar (actual como en el momento la respuesta fue publicada, puede haber cambiado desde entonces):

1.5: 20121 
1.5.1: 20121 
1.5.2: 20121 
1.6: 50428 
2.0: 50823 
2.0.1: 50823 
2.1: 60202 
2.1.1: 60202 
2.1.2: 60202 
2.2: 60717 
2.3a0: 62011 
2.3a0: 62021 
2.3a0: 62011 
2.4a0: 62041 
2.4a3: 62051 
2.4b1: 62061 
2.5a0: 62071 
2.5a0: 62081 
2.5a0: 62091 
2.5a0: 62092 
2.5b3: 62101 
2.5b3: 62111 
2.5c1: 62121 
2.5c2: 62131 
2.6a0: 62151 
2.6a1: 62161 
2.7a0: 62171 
+1

Gracias - esto no me ayudó a resolver mi problema, pero es bueno saber la respuesta de todos modos! – Noah

+0

¿Cómo puedo verificar qué archivo pyc causa el problema, he eliminado todos los archivos pyc pero sigo recibiendo este error. – sunprophit

+0

Quizás necesite 'rm __pycache __/* pyc' ahora, porque los archivos pyc ahora están en esa carpeta. –

38

Eliminación de todos los archivos .pyc solucionará " Bad Magic Number "error.

find . -name "*.pyc" -delete 
+8

Probablemente sea mejor usar 'find. -name "* .pyc" -delete', ya que tendrás problemas con espacios (y posiblemente con una línea de comandos demasiado larga) si expandes todos los nombres de archivos para pasar a 'rm'. –

+15

IMO es una secuencia de comandos bastante peligrosa. ¿Qué sucede si un paquete se entregó solo con archivos .pyc para mantenerlo cerrado? Vaya, acaba de eliminar la aplicación. –

+2

Probablemente lo mejor es ejecutar primero 'find. -name "* .pyc" -print' y solo luego borre los archivos problemáticos manualmente, y/o ejecute el comando anterior, después de verificar que no está haciendo algo lamentable. – michael

0

Esto es mucho más eficiente que el anterior.

find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf 

donde {directory-of-.pyc-files} es el directorio que contiene los archivos compilados pitón.

+1

Eso es en caso de que tengas los archivos py a la mano, si no necesitarás bajar la versión de la instalación de python. –

+1

Esto todavía no es seguro para algunos casos extremos. Además, ¿por qué hacemos una eliminación recursiva cuando estamos hablando de archivos? –

+1

¿Por qué estás usando dos procesos? Incluso si find no tiene delete, aún puede ejecutar 'find/dir -name" * .pyc "-exec rm '{}' ';' ' – mikemaccana

13

Al cargar un archivo python3 generado *.pyc con python2 también se produce este error.

+1

Esto podría ser un comentario, no una respuesta. – Kroltan

+0

@Kroltan, pero es una buena respuesta, mejor que la aceptada. Concisa y al grano. –

+0

@AntonyHatchkins Al menos en mi opinión, esto podría ser un comentario sobre cualquiera de las respuestas que sugieren la eliminación de .pyc. Aunque esta es una posible * causa *, no tiene una * solución * diferente, por lo que es redundante. Siéntase libre de estar en desacuerdo, solo mi opinión. – Kroltan

6

Lleve el archivo pyc a una máquina de Windows. Use cualquier editor Hex para abrir este archivo pyc. Usé freeware 'HexEdit'. Ahora lea el valor hexadecimal de los primeros dos bytes. En mi caso, estos fueron 03 f3.

Abre calc y convierte su modo de visualización a Programmer (Scientific en XP) para ver la conversión hexadecimal y decimal. Seleccione "Hex" del botón de Radio. Ingrese los valores como segundo byte primero y luego como primer byte, es decir, f303. Ahora haga clic en el botón de opción "Dec" (Decimal). El valor mostrado es uno que corresponde al número mágico aka versión de python.

Por lo tanto, teniendo en cuenta la tabla de la respuesta anterior

  • 1,5 => 20121 => 4E99 lo que los archivos tendría primer byte como el 99 y el segundo como 4e
  • 1.6 => 50428 => C4FC lo que los archivos tendría primer byte como fc y el segundo como c4
1

Tuve un caso extraño de error Número mágico malo usando una implementación muy antigua (1.5.2). Genere un archivo .pyo y eso desencadenó el error. Curiosamente, el problema se resolvió cambiando el nombre del módulo. El nombre ofensivo era sms.py. Si genero un sms.pyo de ese módulo, el error fue el Número mágico malo. Cuando cambié el nombre a smst.py, el error desapareció. Revisé hacia adelante y hacia atrás para ver si sms.py de alguna manera interfería con cualquier otro módulo con el mismo nombre, pero no pude encontrar ninguna colisión de nombre. Aunque la fuente de este problema sigue siendo un misterio para mí, recomiendo probar un cambio de nombre de módulo.

0

En mi caso no fue .pyc pero los viejos binarios .mo archivos de traducción después de que el nuevo nombre de mi propio módulo, por lo que dentro de esta carpeta módulo tuve que correr

find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \; 

(por favor hacer copia de seguridad y tratar de solucionar .pyc archivos primero)

1

¡No los elimine! Hasta ..........

Busque una versión en su git, svn o carpeta de copia que funcione.

Eliminarlos y luego recuperar todo .pyc.

Eso es trabajo para mí.

+0

eyyy ¿por qué tengo -1 ? realmente funciona para mí y estaba en una situación realmente mala ¬¬ – lauralacarra

+0

volver a la versión anterior no es una solución global – ZiTAL

0

Esto también puede ocurrir si tiene el archivo python27.dll incorrecto (en el caso de Windows), para resolverlo simplemente vuelva a instalar (o extraer) python con la versión dll correspondiente exacta. Yo tuve una experiencia similar.

0

Acabo de enfrentar el mismo problema con Fedora26 donde muchas herramientas como dnf se rompieron debido al mal número de magia para seis. Por alguna razón desconocida, tengo un archivo /usr/bin/six.pyc, con el número mágico inesperado. Eliminar este archivo soluciona el problema

Cuestiones relacionadas