基本上,我想在我正在编写的python程序中使用无限大小(更准确地说,硬驱动而不是内存绑定)。似乎tempfile和shelve模块自然适合这种情况,但是,我无法看到如何以安全的方式一起使用它们。我希望在搁置GCed时删除临时文件(或者在搁置不使用后保证删除,无论何时删除),但我能想到的唯一解决办法是使用tempfile.TemporaryFile()打开一个文件句柄,从句柄获取文件名,使用这个文件名打开一个shelve,保持对文件句柄的引用,以防止它获取GCed(并删除文件),然后在存储它的shelve上放一个包装器参考。任何人都有比这个错综复杂的混乱更好的解决方案吗?
限制:只能使用标准的python库,并且必须完全跨平台。
答案 0 :(得分:1)
我宁愿从shelve.Shelf继承,并覆盖close方法(*)以取消链接文件。请注意,根据所使用的特定dbm模块,您可能有多个包含该文件架的文件。一种解决方案可能是创建临时目录,而不是临时文件,并在完成后删除目录中的任何内容。另一种解决方案是绑定到特定的dbm模块(例如,bsddb或dumbdbm),并特别删除这些库创建的文件。
(*)注意当货架被垃圾收集时也会调用货架的关闭方法。唯一可以解决垃圾文件问题的方法是解释器崩溃或被杀死。