【发布时间】:2017-03-10 07:37:39
【问题描述】:
在与我腌制文件的模块不同的模块中加载腌制文件时遇到了一些问题。我知道以下线程:Unable to load files using pickle and multipile modules。我已经尝试了将类导入到我正在取消文件的模块中的建议解决方案,但它一直给我同样的错误:
AttributeError: Can't get attribute 'Document' on <module '__main__' from ''>
我正在尝试做的基本结构:
pickle 和 unpickles 对象的 Util 文件,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)
定义Document对象并调用save util方法的文件,class_def.py:
import utils
class Document(object):
data = ""
if __name__ == '__main__':
doc = Document()
utils.save_document(doc)
调用load util方法的文件,process.py:
import utils
if __name__ == '__main__':
utils.load_document(file_path)
运行 process.py 给出了提到的 AttributeError。如果我将 class_def.py 文件导入 process.py 并按照原始线程中提到的那样运行它的 main 方法,它可以工作,但我希望能够分别运行这两个模块,因为 class_def 文件是一个需要相当多的预处理步骤一段时间。我该如何解决这个问题?
【问题讨论】:
-
没有回答您的问题,但您应该在打开文件处理程序后关闭它们,或者直接使用
with。 -
当文件以
__main__运行时,其中定义的任何内容都将作为__main__模块的成员腌制,因此如果您随后加载到不同的文件中,它将失败。您只需要从模块中挑选东西,然后__main__最快的修复是from <this modules name> import *但我不建议在生产代码中使用它。 -
namespace on python pickle 的可能重复项,但我认为可能有更好的线程标记为 dup
-
检查这个线程stackoverflow.com/a/51397373/7429675,你可以这样做
标签: python python-3.x pickle