python - saving - ImportError: Ningún módulo llamado copy_reg pickle
python pickle function (6)
Parece que esto podría ser causado por mi método de exportación del objeto escabechado.
Este informe de error parece indicar que mi problema se puede resolver exportando a un archivo escrito en modo binario. Voy a dar una oportunidad ahora y ver si esto resuelve mi problema.
ACTUALIZACIÓN: Esto funciona. La solución es asegurarse de exportar su objeto escabechado a un archivo abierto en modo binario, incluso si está utilizando el protocolo predeterminado 0 (comúnmente denominado "texto")
Corrija el código basado en el ejemplo original en cuestión:
file = open("test.txt", ''wb'')
thing = {''a'': 1, ''b'':2}
cPickle.dump(thing, file)
Estoy tratando de eliminar un objeto almacenado como blob en una base de datos MySQL. He generado y almacenado manualmente el objeto en escabeche en la base de datos, pero cuando trato de desmantelar el objeto, obtengo la siguiente excepción bastante críptica:
ImportError: Ningún módulo llamado copy_reg
¿Alguna idea de por qué sucede esto?
Método de reproducción
Nota: debe hacer el paso 1 en una PC con Windows y los pasos 3 y 4 en una PC con Linux.
1) En una PC con Windows:
file = open("test.txt", "w")
thing = {''a'': 1, ''b'':2}
cPickle.dump(thing, file)
2) Insertar manualmente los contenidos de text.txt en el campo blob de la base de datos MySQL ejecutándose en Linux
3) En Python ejecutándose en una máquina Linux, busque el contenido de la columna de MySQL
4) Suponiendo que coloque el contenido de la columna blob en una variable llamada datos, intente esto:
cPickle.loads(rawString)
Además, simplemente ejecutar dos2unix (en Linux) sobre el archivo de salmuera (creado por Windows) me solucionó el problema. (No he probado el modo abierto ''wb''.) Dan
solo una sesión de python interactiva para mostrar que no necesita ningún código en particular para tener este problema:
hacer algo como esto en una máquina de Windows
Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle, re
>>> empty_string = re.compile("^$")
>>> pickle.dump([empty_string,1,1.23,''abc''], file(''m:/mario/test-b.dump'',''wb''))
>>> pickle.dump([empty_string,1,1.23,''abc''], file(''m:/mario/test-t.dump'',''wt''))
>>>
y luego intente recuperar los datos de un cuadro de Linux
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.load(file(''/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-b.dump''))
/usr/lib/python2.6/pickle.py:1124: DeprecationWarning: The sre module is deprecated, please import re.
__import__(module)
[<_sre.SRE_Pattern object at 0xb7d42420>, 1, 1.23, ''abc'']
>>> pickle.load(file(''/home/mario/.gvfs/transfer on 192.168.0.4/mario/test-t.dump''))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/pickle.py", line 1370, in load
return Unpickler(file).load()
File "/usr/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.6/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/usr/lib/python2.6/pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named sre
>>>
el mensaje de error puede ser aún más confuso si solo está decapando los tipos de base. esto es lo que obtengo con la lista [12, 1.2, '''']
:
ValueError: insecure string pickle
Otra cosa que sucede aquí es que no pareces haber cerrado el archivo después de tirarle la salmuera. el error que se informa aquí a veces puede ser causado (ya sea en una máquina con Windows o de otra forma) al no cerrar el archivo.
Como se menciona en la otra respuesta uso
dos2unix originalPickle.file outputPickle.file
O use el comando tr como a continuación (elimina los retornos de carro y ctrl-z)
tr -d ''/15/32'' < originalPickle.file > outputPickle.file
O usa awk
( gawk
o nawk
si son versiones antiguas)
awk ''{ sub("/r$", ""); print }'' originalPickle.file > outputPickle.file
O si puedes recrear un archivo pickle en Linux, úsalo.
Es posible que la carga de pickle no esté buscando en la misma ubicación que su secuencia de comandos python. A veces, el directorio cambia en función de su aplicación. Justo antes de cargar el pickle, imprima un os.getcwd () para encontrar una solución.