1

私は macports から python 3.1.4 を実行しており、ここで shelve モジュールを使用しようとしています。別の開発者で正常に使用できます。マシン(異なるOSなど)なので、何が間違っているのかわかりません...

どんな考えや提案も大歓迎です!

これがエラー「dbm.error: db type could not be defined」です (エラーメッセージを検索しましたが、情報が見つかりませんでした - protocl=2 を強制して、それが役立つかどうかを確認しようとしましたが、そうではありませんでした)

インタラクティブなセッションは次のとおりです。

Python 3.1.4 (default, Oct  7 2011, 15:58:53) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
>>> import shelve
>>> a = [1, 2, 3]
>>> locker = shelve.open('myshelf',protocol=2)
>>> locker['a'] = a
>>> locker.close()
>>> exit()


Python 3.1.4 (default, Oct  7 2011, 15:58:53) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
>>> import shelve
>>> locker = shelve.open('myshelf',protocol=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shelve.py", line 231, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shelve.py", line 215, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/dbm/__init__.py", line 84, in open
    raise error[0]("db type could not be determined")
dbm.error: db type could not be determined
4

2 に答える 2

1

これは、MacPorts ポートまたは Python 3 のバグのようです。私にとって、サンプルは現在の MacPorts Python 2.7.2 で動作しますが、現在の MacPorts Python 3.2.2 では、報告したのと同じように失敗します。MacPorts はgdbm、Python 3 ポートのデータベース マネージャーとして自動的にビルドおよびインクルードされます。Python 2 の場合、BerkeleyDB4.6gdbm. MacPorts 2.7.2 は db46 を使用して動作しているように見えますが、3.2.2 はgdbm; の使用に失敗します。おそらく MacPorts 3.1 ポートも同様です。これはさらに調査する必要があります。

更新: 最新の MacPorts インストールを使用している場合、これはおそらくhttp://bugs.python.org/issue13007gdbm 1.9で報告されている問題です。最新以降の MacPorts をサポートする修正があったようです。バージョンは 1.9.1 です。この修正は、Python 3.2.2 がリリースされた後に適用されました (3.2.3 に含まれる予定です)。MacPorts の人々は、それを Python ポートにバックポートする必要があります。

于 2011-11-10T06:12:14.617 に答える
0

MacPorts または Homebrew を使用してndbmをインストールします。それを使用してデータベースを作成します。後でファイルを開くと、shelve は dbm.whichdb呼び出し、ファイルを正常に認識します。

于 2011-11-10T05:32:58.927 に答える