with saving open loads how example python pickle

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.