2009-02-17 16 views
18

Estoy tratando de eliminar un objeto almacenado como un blob en una base de datos MySQL. He generado manualmente y se almacenó el objeto estibado en la base de datos, pero cuando trato de unpickle el objeto, me sale el siguiente excepción más críptica:ImportError: Ningún módulo llamado copy_reg pickle

ImportError: Sin módulo denominado copy_reg

¿Alguna idea de por qué ¿esto pasa?

método de reproducción

Nota: Debe realizar el paso 1 en un PC con Windows y los pasos 3 y 4 en un PC Linux.

1) En un PC con Windows:

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

2) insertar manualmente contenido de text.txt en el campo de gota de la base de datos MySQL se ejecuta en Linux

3) En Python se ejecuta en una máquina Linux, buscar a los contenidos de la columna de MySQL

4) Suponiendo que se pone el contenido de la columna de la burbuja en una variable llamada de datos, intente esto:

cPickle.loads(rawString) 
+0

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

+0

Esto fue con Python 2.4 –

+0

¿Qué código agregar en esta situación? –

Respuesta

23

Parece que esto podría deberse a mi método de exportación del objeto escabechado.

This bug report detecta que mi problema puede resolverse mediante la exportación 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 el objeto escabechado a un archivo abierto en modo binario, incluso si está utilizando el protocolo predeterminado 0 (comúnmente denominado "texto")

Corregir el código según el ejemplo de orignal en cuestión :

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

Una vez más, ¿qué mostraría exactamente el código? ¿Cómo sería de beneficio esta respuesta? –

+0

Si solo quiere mencionar que 'Ningún módulo llamado copy_reg pickle' puede ser también cualquier otro nombre de módulo como en mi caso. Esto puede ser confuso durante la depuración. – holzkohlengrill

12

también, simplemente ejecutando dos2unix (en Linux) sobre el archivo salmuera (ventanas-creados) resolvió el problema para mí. (No he probado el modo de apertura cosa 'wb'.) Dan

3

sólo una sesión interactiva de Python para demostrar que no es necesario ningún código especial para tener este problema:

hacer algo como esto en una máquina ventanas

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 desde una máquina 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 una solo estoy decapando los tipos de base. esto es lo que me pasa con la lista [12, 1.2, '']:

ValueError: insecure string pickle 
1

Otra cosa sucede aquí es que no parece que por haber cerrado el archivo después de descargar la salmuera a la misma. 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.

0

Como se mencionó en la otra respuesta utilizar

dos2unix originalPickle.file outputPickle.file 

o utilice el comando tr, como a continuación (elimina retornos de carro y ctrl-z)

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

o uso awk (gawk o nawk si su versiones antiguas)

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

O R si puedes recrear un archivo pickle en Linux, úsalo.

0

La carga de pickle puede no verse 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.

Cuestiones relacionadas