Я работаю с полкой в python 2.7.6 для кэширования вычислений и столкнулся с проблемой, описанной ЗДЕСЬ для файлы полки, созданные мной, и реализовал предложенное решение в функции, которая объединяет файл other
в файл target
:
... # 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, так что < em>были выполнены очевидные проверки:
$ 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
Здесь cache
— это файл target
, а cache.0
— файл other
. Текущий рабочий каталог принадлежит мне и имеет права доступа 0775
, и я могу без проблем создавать файлы с правами touch
, cp
и т. д. по желанию, и я даже установил для своего umask
значение 0000
, поэтому новые файлы создаются с правами 0666
. , или, что то же самое, -rw-rw-rw-
разрешений.
Я даже сопоставил фактические права доступа к файлам с разрешениями в вызове gdbm.open() в соответствии с его документация; впрочем, безрезультатно.
Обновление: при запуске кода Python с sudo
, т. е. с правами суперпользователя, ошибка возникает в той же строке; однако с другим сообщением: gdbm error: Bad magic number
! Это очень странно, поскольку сам смысл использования модуля (на первый взгляд) более низкого уровня (gdbm
, а не shelve
) как раз и заключался в обходе определения типа базы данных.
Обновление №2: выполнение python 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 не вариант).