我从macports运行python 3.1.4,我试图在这里使用shelve模块。我可以在另一个dev上成功使用它。机器(不同的操作系统等)所以我不确定我可能做错了什么...
非常感谢任何想法或建议!
这是错误 “dbm.error:无法确定db类型” (我搜索了错误消息,但没有找到任何信息 - 我甚至试图强制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
答案 0 :(得分:1)
这看起来像是MacPorts端口或Python 3中的一个错误。对我来说,你的示例适用于当前的MacPorts Python 2.7.2但是使用当前的MacPorts Python 3.2.2失败的方式与你报告的相同。 MacPorts自动构建并包含gdbm
作为Python 3端口的数据库管理器;对于Python 2,它包括Berkeley DB4.6
和gdbm
。看起来MacPorts 2.7.2正在使用db46并且工作但是3.2.2使用gdbm
失败;可能是MacPorts 3.1端口类似。这应该进一步调查。
更新:如果您使用的是最新的MacPorts安装,这可能是http://bugs.python.org/issue13007中报告的问题。看起来有一个修复程序可以支持最新的gdbm 1.9
及更高版本 - 目前的MacPorts版本是1.9.1。该修复程序在Python 3.2.2发布后应用(它将在3.2.3中); MacPorts人员应该将其反向移植到他们的Python端口。
答案 1 :(得分:0)
使用MacPorts或Homebrew安装 ndbm 。搁置用于创建数据库。稍后打开文件时, shelve 将调用 dbm.whichdb 并成功识别该文件。