Получил ошибку gdbm: (13, «Отказано в доступе») — Несмотря на то, что разрешения posix выглядят нормально

Я работаю с полкой в ​​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 не вариант).


person cnaak    schedule 18.09.2016    source источник