Pickle不会从包含对象引用的文件中加载字典

时间:2019-02-17 20:15:03

标签: python python-3.x pickle

我遇到了以下问题。我有一个在其中创建对象的类。然后,我从另一个模块调用该方法,该模块将对象的名称和对其的引用放在字典中,将其腌制并保存在资源包中的“ shared.pkl”文件中。所以我的结构看起来像这样:

├── app/
    ├── package1/
    ├──     ├── module1.py
    ├── 
    ├── package2/
    ├──     ├── module2.py
    ├──    
    ├── 
    ├── resources/
            ├── shared.pkl

我在module1.py中的类如下:

class TestObject:

    def __init__(self):
          pass

def main():

   test_object = TestObject()
   module2.save_to_file(name, test_object)

if __name__ == '__main__':
    main()

我已经将module2导入到module1中,不用担心。那不是问题。这就是我的方法在module2中的样子。

shared_dict = {}
DATA_PATH = pkg_resources.resource_filename(__package__, 'resources/')
DB_FILE=pkg_resources.resource_filename(__package__,
'resources/shared.pkl')

global shared_dict
def save_to_file(name, remote_object):
   try:
       fp = open(DB_FILE, "rb")
       shared_dict = pickle.load(fp)
       shared_dict.update({name: remote_object})
       fp = open("shared.pkl", "wb")
       print(shared_dict)
       pickle.dump(shared_dict, fp)
   except Exception as e:
       fp = open(DB_FILE, "wb")
       shared_dict.update({name: remote_object})
       print(shared_dict)
       pickle.dump(shared_dict, fp)
   finally:
       fp.close()

当我第一次运行该程序时,找不到shared.pkl并捕获了异常,该异常会创建文件并在其中插入数据。但是,当我第二次运行该程序时,它停留在shared_dict = pickle.load(fp)处。在调试模式下,它仅显示loader={SourceLoader}<_frozen_importlib_external.SourceFileLoader object at 0x7f5ada68cba8>

我不知道它与该类是否有关系,即因为该对象的类在另一个模块中,因此不能被解开。

P.S。我知道这不是处理文件读取和写入文件的最合适方法,但是请原谅,我是一个初学者。

更新解决方案 由于pickle不能对 main 模块进行pickle,因此使用莳萝解决了该问题。莳萝是泡菜的扩展,具有更多的可能性。

0 个答案:

没有答案