gpt4 book ai didi

python-3.x - 搁置存档无法在其他计算机上打开

转载 作者:行者123 更新时间:2023-12-05 06:45:38 25 4
gpt4 key购买 nike

我已经用搁置保存了一些对象。在另一个文件中,我能够恢复这些对象。但是当我将存档复制到另一台计算机时,shelve 给我一个 _gdbm.error: File read error。包含存储对象类的包可以在两台计算机上直接访问(但它们存储在不同的位置并使用 PYTHONPATH 添加)。两台机器都在 Ubuntu 13.10 上运行,一台是 32 位的,另一台是 64 位的。

这些文件不应该是独立于机器的吗?

在我得到的64位机器上

>>> import shelve
>>> shelve.open('arch.db')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.3/shelve.py", line 232, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/usr/lib/python3.3/shelve.py", line 216, in __init__
Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
File "/usr/lib/python3.3/dbm/__init__.py", line 94, in open
return mod.open(file, flag, mode)
_gdbm.error: File read error

并且在 32 位机器上它可以工作。

当我在 64 位机器上创建存档时,它可以在 32 位机器上打开,但是交互式 python 提示崩溃:

>>> import shelve
>>> s = shelve.open('arch.db')
>>> for i in s.items(): print(i)
...
gdbm fatal: lseek error

我什至没有得到回溯。

这真的很烦人,我打算在两台计算机上工作,但目前我只能使用速度较慢的 32 位 eeepc,因为我已经在存档中保存了很多内容。

最佳答案

问题是 shelve 使用了 gdbm (作为默认后端存储序列化对象的 dbm.gnu 提供。使用 gdbm 创建的文件取决于系统的体系结构,因此只能在 32 位 64 位上使用系统。

有一些工具(gdbmexportgdbm_dump)允许您转换 gdbm 文件,但是,如果您希望定期从两个系统访问文件。

幸运的是,python 提供了不同的后端:dbm.gnudbm.ndbmdbm.dumb。后两者与平台无关。

import shelve
import dbm
dbm._defaultmod = dbm.ndbm
db = shelve.open('somename')

上面代码的数据库可以在64位和32位系统上使用。

只有在创建文件时才需要设置默认后端。 dbm 在打开之前检查数据库的文件类型并使用正确的后端。

请注意,上面的代码更改了整个 python 进程的默认 dbm。如果另一个组件依赖于默认的 gdbm,则它可能会中断。

关于python-3.x - 搁置存档无法在其他计算机上打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com