我正在从 macports 运行 python 3.1.4,并且我尝试在此处使用 shelve 模块。我可以在另一个开发人员上成功使用它。机器(不同的操作系统等),所以我不确定我可能做错了什么......
如有任何想法或建议,我们将不胜感激!
这是错误 “dbm.error:无法确定数据库类型” (我搜索了错误消息,但没有找到任何信息 - 我什至尝试强制 protocl=2 以查看是否有帮助,但没有)
这是交互式 session :
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
最佳答案
这看起来像是 MacPorts 端口或 Python 3 中的错误。对我来说,您的示例适用于当前的 MacPorts Python 2.7.2,但不适用于当前的 MacPorts Python 3.2.2,与您报告的方式相同。 MacPorts 自动构建并包含 gdbm
作为 Python 3 ports 的数据库管理器;对于 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 端口。
关于在 10.5.8 上从 Macports 安装的 Python 3.1 - 搁置错误(是否有错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8075324/