Ich habe Probleme beim Laden einer gebeizten Datei in einem Modul, das sich von dem Modul unterscheidet, in dem ich die Datei gebeizt habe. Ich kenne den folgenden Thread: Unable to load files using pickle and multipile modules. Ich habe die vorgeschlagene Lösung der Import der Klasse in das Modul versucht, wo ich meine Datei bin Unpickling, aber es hält mich den gleichen Fehler geben: AttributeError: Can't get attribute 'Document' on <module '__main__' from ''>
Beladenes Objekt in anderer Datei laden - Attributfehler
Die Grundstruktur von dem, was ich zu tun versucht:
util-Datei, die Gurken und unpickles Objekte, utils.py:
import pickle
def save_document(doc):
from class_def import Document
write_file = open(file_path, 'wb')
pickle.dump(doc, write_file)
def load_document(file_path):
from class_def import Document
doc_file = open(file_path, 'rb')
return pickle.load(doc_file)
Datei in dem Dokument-Objekt definiert ist und die util Methode speichern genannt wird, class_def.py:
import utils
class Document(object):
data = ""
if __name__ == '__main__':
doc = Document()
utils.save_document(doc)
Datei, wo die Last util-Methode aufgerufen wird, process.py:
import utils
if __name__ == '__main__':
utils.load_document(file_path)
Lauf process.py gibt dem erwähnten Attribute. Wenn ich die Datei class_def.py in process.py importiere und ihre Hauptmethode wie im ursprünglichen Thread erwähnt ausführe, funktioniert sie, aber ich möchte diese beiden Module separat ausführen können, da die Datei class_def ein Vorverarbeitungsschritt ist, der ziemlich dauert irgendwann. Wie könnte ich das lösen?
Beantwortet Ihre Frage nicht, aber Sie sollten die Dateihandler schließen, nachdem Sie sie geöffnet haben, oder einfach [' mit'] (http://effbot.org/zone/python-with-statement .htm). – Itay
Wenn eine Datei als '__main__' ausgeführt wird, werden alle darin definierten Elemente als Mitglieder des' __main__' - Moduls markiert. Wenn Sie also in eine andere Datei laden, schlägt das fehl Dinge aus anderen Modulen als '' __main__' die schnellste Lösung ist 'von import *' aber ich empfehle es nicht im Produktionscode –
mögliches Duplikat von [namespace on python pickle] (http: // stackoverflow. com/q/7928450/5827215), aber ich denke, es könnte einen besseren Thread als dup markieren –