私は計算をキャッシュするためにpython 2.7.6でシェルブを使用していますが、私が作成したシェルブファイルについてHEREで説明されている問題に遭遇し、ファイルをファイルにマージする関数で提案されたソリューションを実装しました: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'))
...
2 つのファイルは私が所有し、ローカル ファイル システムに記録され、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
ここで、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のアップグレードはオプションではありません)。