从10.5.8上的Macports安装的Python 3.1-搁置错误(是否有错误?)

从10.5.8上的Macports安装的Python 3.1-搁置错误(是否有错误?),python,macos,macports,shelve,Python,Macos,Macports,Shelve,我在macports上运行Python3.1.4,并尝试在这里使用搁置模块。我可以在另一台开发机器(不同的操作系统等)上成功地使用它,所以我不确定我可能做得不正确 如有任何想法或建议,将不胜感激 这里是错误 “dbm.error:无法确定数据库类型” (我搜索了错误消息,但没有找到任何信息-我甚至试图强制protocl=2以查看这是否有帮助,但没有) 以下是互动环节: Python 3.1.4 (default, Oct 7 2011, 15:58:53) [GCC 4.0.1 (Apple

我在macports上运行Python3.1.4,并尝试在这里使用搁置模块。我可以在另一台开发机器(不同的操作系统等)上成功地使用它,所以我不确定我可能做得不正确

如有任何想法或建议,将不胜感激

这里是错误 “dbm.error:无法确定数据库类型” (我搜索了错误消息,但没有找到任何信息-我甚至试图强制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
Python 3.1.4(默认,2011年10月7日15:58:53)
[GCC 4.0.1(苹果公司5493版)]关于达尔文
>>>进口货架
>>>a=[1,2,3]
>>>locker=shelve.open('myshelf',协议=2)
>>>储物柜['a']=a
>>>储物柜关闭()
>>>退出()
Python 3.1.4(默认值,2011年10月7日,15:58:53)
[GCC 4.0.1(苹果公司5493版)]关于达尔文
>>>进口货架
>>>locker=shelve.open('myshelf',协议=2)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
打开文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shelve.py”,第231行
返回DbfilenameShelf(文件名、标志、协议、写回)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/shelve.py”,第215行,在__
Shelf.\uuuu init\uuuuu(self,dbm.open(文件名,标志),协议,写回)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/dbm/_init__.py”,第84行,打开
引发错误[0](“无法确定数据库类型”)
dbm.error:无法确定数据库类型

使用MacPorts或自制软件安装ndbm。搁置并使用它创建数据库。稍后打开文件时,shelve将调用dbm.whichdb并成功识别该文件。

使用MacPorts或自制软件安装ndbm。搁置并使用它创建数据库。稍后打开文件时,shelve将调用dbm.whichdb并成功识别该文件。

这看起来像MacPorts端口或Python 3中的错误。对我来说,您的示例可以使用当前的MacPorts Python 2.7.2,但无法使用当前的MacPorts Python 3.2.2,方法与您报告的相同。MacPorts自动构建并包括
gdbm
,作为Python 3端口的数据库管理器;对于Python2,它包括Berkeley
DB4.6
gdbm
。看起来MacPorts 2.7.2使用的是db46,可以正常工作,但3.2.2使用的是
gdbm
;大概MacPorts 3.1端口是类似的。这应该进一步调查


更新:如果您使用的是最新的MacPorts安装,则可能是其中报告的问题看起来有修复程序支持最新的
gdbm 1.9
及更高版本-当前的MacPorts版本是1.9.1。该修复是在Python 3.2.2发布后应用的(将在3.2.3中使用);MacPorts的人应该将其向后移植到他们的Python端口。

这看起来像MacPorts端口或Python 3中的一个bug。对我来说,您的示例可以使用当前的MacPorts Python 2.7.2,但无法使用当前的MacPorts Python 3.2.2,方法与您报告的相同。MacPorts自动构建并包括
gdbm
,作为Python 3端口的数据库管理器;对于Python2,它包括Berkeley
DB4.6
gdbm
。看起来MacPorts 2.7.2使用的是db46,可以正常工作,但3.2.2使用的是
gdbm
;大概MacPorts 3.1端口是类似的。这应该进一步调查


更新:如果您使用的是最新的MacPorts安装,则可能是其中报告的问题看起来有修复程序支持最新的
gdbm 1.9
及更高版本-当前的MacPorts版本是1.9.1。该修复是在Python 3.2.2发布后应用的(将在3.2.3中使用);MacPorts的人应该将其向后移植到Python端口。

Hmmm,ndbm似乎是罪魁祸首,但MacPorts将其包装到Python 3.1安装中。我将不得不从其他地方获得它,看看我可以如何破解tring来安装它:-)嗯,似乎ndbm是罪魁祸首,但macports将其包装到python 3.1安装中。我将不得不在其他地方找到它,看看我能破坏tring来安装它:-)嗯,我希望这不是答案。很难相信我是从Macports安装后第一个尝试将shelve与python 3.1结合使用的人,但现在就到了…
有没有关于临时解决方案的想法?我不想开始修补它,但如果我可以将一个参数传递到我的搁置调用中,以强制使用不同的db,这将(至少)让我通过这个路障…对不起!还请注意,3.1已被3.2淘汰。这将是一个好主意,移动到它;在3.2和3.1中有很多修复和改进,现在处于安全修复模式。手动将3.2补丁应用到3.1应该很容易,直到它在MacPorts中修复:文件位于/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/dbm/_uinit_uu.pyHmmm,我希望这不是答案。很难相信我是从Macports安装后第一个尝试将shelve与python 3.1结合使用的人,但现在就到了…
有没有关于临时解决方案的想法?我不想开始修补它,但如果我可以将一个参数传递到我的搁置调用中,以强制使用不同的db,这将(至少)让我通过这个路障…对不起!还请注意,3.1已被3.2淘汰。这将是一个好主意,移动到它;3.2和3.1中有很多修复和改进,现在处于仅安全修复模式。在MacPorts中修复之前,手动将3.2修补程序应用到3.1应该很容易:文件位于/opt/local/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/dbm/_uinit_uuu.py