2010-09-01 5 views
13

Estoy tratando de extraer una instancia de una clase en un módulo y eliminarla en otro.AttributeError al desatornillar un objeto

Aquí es donde PIckle:

import cPickle 

def pickleObject(): 
    object = Foo() 
    savefile = open('path/to/file', 'w') 
    cPickle.dump(object, savefile, cPickle.HIGHEST_PROTOCOL) 


class Foo(object): 
    (...) 

y aquí es donde trato de unpickle:

savefile = open('path/to/file', 'r') 
object = cPickle.load(savefile) 

En esa segunda línea, consigo AttributeError: 'module' object has no attribute 'Foo'

Cualquiera que ver lo que estoy haciendo ¿incorrecto?

Respuesta

17

class Foo debe ser importable a través de la misma ruta en el entorno de deshecho para que el objeto escabechado se pueda volver a instalar.

Creo que su problema es que define Foo en el módulo que está ejecutando como principal (__name__ == "__main__"). Pickle serializará la ruta (¡no el objeto de clase/definición!) Al Foo como en el módulo principal. Foo no es un atributo de la secuencia de comandos principal unpickle.

En este ejemplo, podría redefinir class Foo en la secuencia de comandos que se deshace y debería deshinchar muy bien. Pero la intención es realmente tener una biblioteca común que se comparte entre los dos scripts que estarán disponibles por la misma ruta. Ejemplo: definir Foo en foo.py

ejemplo simple:

$ project_dir/foo.py

class Foo(object): 
    pass 

$ project_dir/picklefoo.py

import cPickle 
from foo import Foo 

def pickleObject(): 
    obj = Foo() 
    savefile = open('pickle.txt', 'w') 
    cPickle.dump(obj, savefile, cPickle.HIGHEST_PROTOCOL) 


pickleObject() 

$ PROJECT_DIR/unpicklefoo.py

import cPickle 

savefile = open('pickle.txt', 'r') 
obj = cPickle.load(savefile) 
... 
+0

Eso lo hizo. Gracias por su ayuda chicos. – Max

3

Jeremy Brown tenía la respuesta correcta, aquí hay una versión más concreta del mismo punto:

import cPickle 
import myFooDefiningModule 
def pickleObject(): 
    object = myFooDefiningModule.Foo() 
    savefile = open('path/to/file', 'w') 
    cPickle.dump(object, savefile) 

y:

import cPickle 
import myFooDefiningModule 
savefile = open('path/to/file', 'r') 
object = cPickle.load(savefile) 

tal que Foo vidas en el mismo espacio de nombres en cada pieza de código.

Cuestiones relacionadas