【问题标题】:Can a GDBM database created in C be opened in Python?用 C 创建的 GDBM 数据库可以用 Python 打开吗?
【发布时间】:2013-04-07 00:10:06
【问题描述】:

我有一个 Python 程序,我在其中尝试使用 this rhyming dictionary 来查找韵律。

字典库设置的一部分由创建三个 gdbm .db 文件的 C 程序工作。执行此操作的代码是公开可用的 here(来自“获取源代码”部分),C gdbm 构建器 compile.c 的关键部分如下所示:

#include <gdbm.h>

...<snip>...

int main(int argc, char *argv[]) {
  FILE *input;
  GDBM_FILE output;

...<snip>...

output = gdbm_open(argv[2], 0, GDBM_NEWDB, 0644, 0);

...<snip>...

gdbm_sync(output);

...<snip>...

words.db 已创建,并且可以从捆绑的命令行界面成功访问。

根据the library's example page,我应该可以使用python gdbm模块访问数据库了。

但是,我不能。当我运行以下命令时:

import gdbm
words = gdbm.open('/usr/share/rhyme/words.db')

我收到以下错误:

    words = gdbm.open('/usr/share/rhyme/words.db')
gdbm.error: Bad magic number

是否存在文件不兼容问题?用 C 语言创建的一些 gdbm 文件不能用 Python 打开吗?

(这是 OSX 10.6.8 上的 Python 2.7。Python 的 gdbm 是通过 MacPorts 安装的)

【问题讨论】:

  • 对我来说很好用:r["AY1-M"] = "ANTICRIME BEIM CHIME CLIMB CLIME CRIME DIME GRIME HAIM HEIM HIME I'M KIME LIME LYME MIME ONETIME PART-TIME PRIME RHYME RIME SEIM SIME SLIME SUBLIME SYME THYME TIME" 我在 Ubuntu (Precise) 上使用标准的 "libgdbm-dev" 包编译了数据库,并使用 Python 2.7.3 读取它。
  • 好的,谢谢,这让我觉得这是 OSX 特有的问题。可能与我通过 MacPorts 与操作系统的 GDBM 安装的 GDBM 风格有关。
  • 嘿比尔。你能删除图书馆吗?您能比较 gdbm 标头吗?

标签: python c macos magic-numbers gdbm


【解决方案1】:

您是如何创建 words.db 文件的?看起来 words.db 已损坏或格式不受您在 Mac OS X 上的特定版本的 gdbm 库支持。

【讨论】:

  • gdbm 文件是由我平台上的 C 程序创建的;我已经给出了我的问题中使用的代码的 sn-ps,并且这个 C 程序的整个源文件也链接在问题中。所以问题似乎是我的平台上C创建的gdbm文件在我的平台上无法被Python读取。
  • 作为一个快速测试,编写一个python程序来创建一个空的gdbm数据库。比较两个 .db 文件的头文件——一个由 C 程序创建,一个由 Python 创建。检查前 2 或 4 个字节是否相同?也许你安装了两个不同的 libgdbm 库?
  • 我想我确实安装了两个不同的库——一个来自源代码的 C 库和一个通过 MacPorts 的 Python。我会按照你的建议做,并替换标题。
  • 错误消息意味着用于将文件标识为 GNU dbm 文件的“幻数”与 libgdbm 所期望的不匹配。这些幻数通常是文件中的前 2-4 个字节。一个图书馆可能期待不同的东西。您还可以从源代码中执行“卸载”并卸载已安装的库。如果你幸运的话,这会奏效。
  • 好的,谢谢,我现在知道了。出于某种原因,正如您所建议的,在 C 中创建的 gdbm 文件的前几个字节与在 Python 中创建的不同。我手动更改了 C 以匹配 Python 与 Hex 编辑器,现在它可以工作了!只是一个一次性的解决方案,但它现在可以解决问题。谢谢。
【解决方案2】:

引用 Python 的创造者(都跪下重复我们不配! x3 :-)

简单——gdbm 对字节顺序很敏感。唉,我不知道 除了将其转换为更便携的格式之外该怎么做 转移或修补 gdbm 源 :-(

--Guido van Rossum(主页:http://www.python.org/~guido/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2017-11-10
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多