ImportError: ningún módulo llamado copy_reg pickle

Estoy tratando de descomprimir un objeto almacenado como un blob en una base de datos MySQL. He generado y almacenado manualmente el objeto encurtido en la base de datos, pero cuando bash desentrañar 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 realizar 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) Inserte manualmente el contenido de text.txt en el campo blob de la base de datos MySQL que se ejecuta en Linux

3) En Python ejecutándose en una máquina Linux, busque el contenido de la columna desde MySQL

4) Suponiendo que coloca el contenido de la columna de blob en una variable llamada datos, intente esto:

 cPickle.loads(rawString) 

Parece que esto podría deberse a mi método de exportar el objeto encurtido.

Este informe de errores parece sugerir que mi problema se puede resolver exportando a un archivo escrito en modo binario. Voy a probar esto ahora y ver si esto resuelve mi problema.

ACTUALIZACIÓN: Esto funciona. La solución es asegurarse de exportar su objeto encurtido a un archivo abierto en modo binario, incluso si está usando el protocolo predeterminado 0 (comúnmente denominado “texto”)

Código correcto basado en el ejemplo original en cuestión:

 file = open("test.txt", 'wb') thing = {'a': 1, 'b':2} cPickle.dump(thing, file) 

Además, simplemente ejecutando dos2unix (bajo linux) sobre el archivo pickle (creado por windows) resolví el problema por mí. (No he probado el modo abierto ‘wb’.) Dan

solo una sesión interactiva de python 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 tratar de recuperar los datos de una caja 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 "", line 1, in  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á seleccionando tipos de bases. esto es lo que obtengo con la lista [12, 1.2, ''] :

 ValueError: insecure string pickle 

Otra cosa que está sucediendo aquí es que parece que no has cerrado el archivo después de haberle tirado el pepinillo. el error reportado aquí a veces puede ser causado (ya sea en una máquina con Windows o de otra manera) al no cerrar el archivo.

Como se menciona en el otro uso de la respuesta.

 dos2unix originalPickle.file outputPickle.file 

O use el comando tr como se muestra a continuación (elimina los retornos de carro y ctrl-z)

  tr -d '\15\32' < originalPickle.file > outputPickle.file 

O use awk ( gawk o nawk si sus versiones anteriores)

  awk '{ sub("\r$", ""); print }' originalPickle.file > outputPickle.file 

O si puede volver a crear un archivo pickle en linux, úselo.

Es posible que la carga de salmuera no esté mirando en la misma ubicación que su script de 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.

mi problema:

 with open('model.pkl', 'rb') as f: subsection_struct_model = pickle.load(f) 

cuando recibo el model.pkl desde Windows ejecuto este código en mi mac, este problema viene

resolver:

 dos2unix model.pkl 

esta bien

Esto sucede porque en Windows, el nuevo símbolo de línea se almacena como “\ r \ n”, y en Linux es “\ n”, por lo que lo que debe hacer es leer la línea del archivo de pickle, reemplazar “\ r \ n “con” \ n “, y vuelva a escribirlo en el archivo.

A diferencia del enfoque de dos2unix, se omitirá el archivo binario, esto también funciona bien para el archivo de pickle binario.

El código es simple:

 #run this code on Linux platform DIR="your/dir/to/file" pickle.load(open(DIR,"rb")) # ImportError: No module named copy_reg pickle a=open(DIR,"rb").readlines() #read pickle file line by line a=map(lambda x:x.replace("\r\n","\n"),a) # replace \r\n with \n with open(DIR,"wb") as j: #write back to file in binary mode for i in a: j.write(i) pickle.load(open(DIR,"rb")) #Now it works well 

Además, puede usar el modo de escritura normal, simplemente cambie “wb” a “w” y “rb” a “e”.