AttributeError al desempaquetar un objeto

Estoy tratando de encurtir una instancia de una clase en un módulo y descomprimirla en otro.

Aquí es donde escurro:

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 desentrañar:

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

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

¿Alguien ve lo que estoy haciendo mal?

class Foo debe ser importable a través de la misma ruta en el entorno de descifrado para que el objeto encurtido pueda ser reenviado.

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

En este ejemplo, podría redefinir la class Foo en el script de descifrado y debería desentrañar bien. Pero la intención es realmente tener una biblioteca común que se comparta 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) ... 

Jeremy Brown tuvo 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) 

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