2

我正在使用 python 2.7.6 中的搁置来缓存计算,我遇到了这里描述的问题,用于我生成的搁置文件,并在将文件合并到文件的函数中实现了建议的解决方案othertarget

... # target and other are strings
# Loads the gdbm module, as suggested
mod = __import__("gdbm")
# Open target for modifications
tar = shelve.Shelf(mod.open(target, 'c', 0666)) # THROWS EXCEPTION
# Open other for reading
oth  = shelve.Shelf(mod.open(other, 'r'))
...

这两个文件归我所有,记录在本地文件系统中,并将 posix 权限设置为0666,或者等效地,-rw-rw-rw-在我的 Linux Mint 框中,因此已经执行了明显的检查

$ ls -l
-rw-rw-rw- 1 myusr mygrp 11694080 Sep 17 21:24 cache
-rw-rw-rw- 1 myusr mygrp 12189696 Sep 17 21:23 cache.0

这里,cachetarget,cache.0other文件。当前工作目录归我所有并具有权限0775,我可以使用 , 等创建文件touchcp没有任何问题,我什至将 my 设置umask0000,因此创建新文件时使用0666, 或等价的-rw-rw-rw-权限.

根据其文档,我什至将实际文件权限与 gdbm.open() 调用中的权限相匹配;然而,无济于事。

更新:通过使用超级用户权限运行python代码sudo,错误发生在同一行;但是有不同的信息:gdbm error: Bad magic number!这很奇怪,因为使用(看似)较低级别的模块(gdbm而不是shelve)正是为了绕过数据库类型检测。

更新#2python whichdb.py在文件上运行返回dbhash;但是,将模块更改为dbhash加载代码仍然会出现以下错误:

bsddb.db.DBAccessError: (13, 'Permission denied')

以用户身份运行时,但是

bsddb.db.DBInvalidArgError: (22, 'Invalid argument -- BDB0210 ././merge-cache.py: metadata page checksum error')

使用 sudo 运行时;merge-cache.py是我的代码名称。

这里讨论了这个新错误,与 python 版本有关,但是 (i) 我的 python 版本与那篇文章中的不同,并且 (ii) 文件被创建并稍后使用相同版本的 python 读取。

这个答案表明shelve大型集合“浪费”了,但我报告的问题也发生在较小的数据库中。

问题:如何使用 python-2.7.6 打开这些搁置文件?(升级 python 不是一种选择)。

4

0 回答 0