我遇到了以下问题。我有一个在其中创建对象的类。然后,我从另一个模块调用该方法,该模块将对象的名称和对其的引用放在字典中,将其腌制并保存在资源包中的“ 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,因此使用莳萝解决了该问题。莳萝是泡菜的扩展,具有更多的可能性。