python - barplot - ¿Cuál es el error del número mágico malo?
pandas plot (12)
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. Eliminando este archivo arreglamos el problema
¿Cuál es el ImportError de "Número mágico incorrecto" en Python, y cómo lo arreglo?
Lo único que puedo encontrar en línea sugiere que esto se debe al compilar 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é.
La información que Python proporciona en el rastreo no es particularmente útil (por eso preguntaba 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
Cargar un archivo *.pyc
.pyc generado con python3 con python2 también provoca este error.
El error "Número mágico incorrecto" también ocurre si ha nombrado manualmente su archivo con una extensión .pyc
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 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 intentar ejecutar un pyc
desde una versión diferente de python (generalmente más tarde) que su intérprete.
Si son sus archivos pyc
, simplemente bórrelos y permita que el intérprete vuelva a compilar los archivos py
. En los sistemas de tipo UNIX, eso podría ser algo tan simple como:
rm *.pyc
o:
find . -name ''*.pyc'' -delete
Si no son tuyos, tendrás que obtener los archivos py
para volver a compilarlos o un intérprete que pueda ejecutar los archivos pyc
con ese valor mágico en particular.
Una cosa que podría estar causando la naturaleza intermitente. El pyc
que está causando el problema solo puede importarse bajo ciertas condiciones. Es muy poco probable que a veces importe. ¿Debe verificar el seguimiento real de la pila completa cuando falla la importación?
Como 2.5.1(r251:54863)
aparte, la primera palabra de todos mis archivos pyc
2.5.1(r251:54863)
es 62131
, 2.6.1(r261:67517)
es 62161
. La lista de todos los números mágicos se puede encontrar en Python/import.c
, reproducida aquí en forma completa (actual desde el momento en que se publicó la respuesta, 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
Eliminar todos los archivos .pyc solucionará el error "Número mágico incorrecto".
find . -name "*.pyc" -delete
En mi caso, no se trataba de .pyc
traducción binarios .mo
.pyc
sino antiguos, después de que .mo
nombre de mi propio módulo, así que dentro de esta carpeta del módulo tuve que ejecutar
find . -name /*.po -execdir sh -c ''msgfmt "$0" -o `basename $0 .po`.mo'' ''{}'' /;
(por favor haga una copia de seguridad y trate de arreglar los archivos .pyc
primero)
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 de Python.
Esto también puede deberse a que falta el archivo __init__.py
del directorio. Diga que si crea un nuevo directorio en django para separar las pruebas unitarias en varios archivos y los coloca en un directorio, también tiene que crear el archivo __init__.py
junto a todos los demás archivos en el directorio de prueba creado __init__.py
. de lo contrario, puede dar un error como Traceback (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''
Esto también puede suceder si tiene el archivo python27.dll incorrecto (en el caso de Windows), para resolver este problema, vuelva a instalarlo (o extraiga) python con la versión exacta de dll correspondiente. Yo tuve una experiencia similar.
No los borres !!! Hasta..........
Encuentre una versión en su git, svn o carpeta de copia que funcione.
Bórralos y luego recupera todos los .pyc.
Eso es trabajo para mí.
Tome el archivo pyc a una máquina de Windows. Use cualquier editor Hex para abrir este archivo pyc. Usé el software gratuito ''HexEdit''. Ahora lee el valor hexadecimal de los dos primeros bytes. En mi caso, estos fueron 03 f3.
Abra calc y convierta su modo de visualización a Programador (Científico en XP) para ver la conversión hexadecimal y decimal. Seleccione "Hex" en el botón de radio. Ingrese los valores como segundo byte primero y luego el primer byte, es decir, f303 Ahora haga clic en el botón de radio "Dec" (Decimal). El valor mostrado es el que corresponde al número mágico, también conocido como versión de python.
Por lo tanto, teniendo en cuenta la tabla proporcionada en la respuesta anterior
- 1.5 => 20121 => 4E99 para que los archivos tengan el primer byte como 99 y el segundo como 4e
- 1.6 => 50428 => C4FC para que los archivos tengan el primer byte como fc y el segundo como c4
Tuve un caso extraño de error de Número Mágico Malo al usar 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 desde ese módulo, el resultado fue un error de Número Mágico Malo. Cuando cambié el nombre a smst.py, el error desapareció. Revisé de un lado a otro para ver si sms.py de alguna manera interfirió 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 de módulo.