Estoy tratando de unpickle un objeto almacenado como un blob en una base de datos MySQL. He generado manualmente y se almacena el escabeche objeto en la base de datos, pero cuando intento unpickle el objeto, me sale el siguiente críptica excepción:

ImportError: No module named copy_reg

Alguna idea de por qué sucede esto?

Método de Reproducción

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

1) En un PC con Windows:

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

2) insertar Manualmente el contenido de text.txt en campo blob de la base de datos MySQL se ejecuta en linux

3) En Python que se ejecuta en una máquina linux, recuperar el contenido de la columna de MySQL

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

cPickle.loads(rawString)
  • ¿qué versión de python estás usando?
  • Esto fue con Python 2.4
  • ¿Cuál sería el código a añadir en esta situación?
  • Edmonds: Ya que no hay código, que se vio obligado a asumir lo que el código que estaba utilizando. Lamentablemente, el código supuse que funcionó a la perfección, así que no podía reproducir el problema. Si yo tuviera tu código, en lugar de la mía, yo podría haber sido capaz de ayudar.
  • S. Lott: ahora he añadido fragmentos de código, pero como se puede ver, que en realidad no ayudan mucho. La razón principal de que el problema es difícil de reproducir es que usted necesita para pickle el objeto en Windows, guardar en un archivo y, a continuación, tratar y unpickle en Linux.
  • Edmonds: tomo nota de que ninguno de los Windows-Linux cosas en la pregunta original. Resulta que proporcionar el código también incluye útiles, interesantes hechos.
  • El extra de rarezas con esto es que, incluso si ‘copy_reg’ existe en el interior de la sys.módulos de obtener la críptica ImportError: no module named copy_reg.
  • Este problema es aún más frustrante tratar con git cambios en los finales de línea en las máquinas de windows

8 Comentarios

  1. 23

    Parece que esto podría ser causado por el método de exportación de vinagre objeto.

    Este informe de error seens sugerir que mi problema puede ser resuelto por la exportación a un archivo escrito en modo binario. Voy a dar a este un ir y ver si esto soluciona mi problema.

    ACTUALIZACIÓN: Esto funciona. La solución es asegurarse de que usted exporte su escabeche objeto a un archivo abierto en modo binario, incluso si usted está utilizando el protocolo predeterminado 0 (lo que comúnmente se conoce como «texto»)

    Código correcto basado en orignal ejemplo en la pregunta:

    file = open("test.txt", 'wb')
    thing = {'a': 1, 'b':2}
    cPickle.dump(thing, file)
    • De nuevo, ¿qué sería exactamente el código de mostrar? ¿Cómo podría ser de beneficio para esta respuesta?
    • Si sólo quiero mencionar que No module named copy_reg pickle también puede ser cualquier otro nombre de módulo como en mi caso. Esto puede ser confuso durante la depuración.
  2. 15

    También, simplemente ejecutando dos2unix (bajo linux) sobre el (windows-creado) archivo pickle resuelto el problema para mí. (No he probado el modo de abrir ‘wb’ cosa.)
    Dan

    • Este shoiuld ser una respuesta a
  3. 3

    sólo un sistema interactivo de python sesión para mostrar que no es necesario ningún código determinado a tener este problema:

    hacer algo como esto en una máquina con 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, a continuación, 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 usted se acaba de decapado tipos de base. esto es lo que me pasa con la lista de [12, 1.2, '']:

    ValueError: insecure string pickle
  4. 1

    Otra cosa que ocurre aquí es que no parecen haber cerrado el archivo después de volcar el pepinillo a ella. el error aquí puede ser causado en ocasiones (ya sea en una máquina windows o de otro tipo) por no cerrar el archivo.

  5. 1

    Como se mencionó en la otra respuesta uso

    dos2unix originalPickle.file outputPickle.file

    O utilice el comando tr como el de abajo (elimina los retornos de carro y ctrl-z)

      tr -d '' < originalPickle.file > outputPickle.file

    O uso awk (gawk o nawk si sus viejas versiones)

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

    O si puede volver a crear un archivo pickle en linux, uso que.

  6. 1

    mi problema:

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

    cuando llego a la modelo.pkl de que windows se ejecute este código en mi mac,este problema se viene

    resolver:

    dos2unix model.pkl 

    es ok!

  7. 1

    Que esto suceda debido a que en Windows, la nueva línea de símbolo se almacena como «\r\n», y que en Linux es «\n»,así que lo que debe hacer es leer el archivo pickle línea por línea, reemplazar «\r\n» con «\n», y escribir en el archivo.

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

    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

    También, usted puede utilizar normal modo de escritura, solo cambie «wb» a «w» y «rb» a la «e».

    • Respuesta sencilla. Funciona! Gracias!
  8. 0

    El pepinillo carga no puede estar buscando en el mismo lugar de su secuencia de comandos de python. A veces los cambios de directorio en la base de su solicitud. Justo antes de cargar el pepinillo, la impresión de un sistema operativo.getcwd() para llegar a una solución.

Dejar respuesta

Please enter your comment!
Please enter your name here