Docker中Python shelve出现Bad magic number

3

我有一个使用Python 3.4和UTF-8编码生成的Python shelve文件。该文件可以在主机上正常打开和访问。但是当我在python:3.4 Docker容器中访问文件时,出现了以下问题:

>>> shelve.open('data/countries.shelf')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/shelve.py", line 243, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/local/lib/python3.4/shelve.py", line 227, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/usr/local/lib/python3.4/dbm/__init__.py", line 94, in open
    return mod.open(file, flag, mode)
_gdbm.error: Bad magic number

无论文件是在构建期间实际复制还是绑定挂载到容器中,都不会有任何区别,错误是相同的。我还比较了容器内外文件的md5sum值,它们是相同的(正如我所预期的)。但如果文件是相同的,那么魔数怎么可能不同呢?

2
你可能需要使用相同的Python版本,而不仅仅是匹配主要版本。 - jordanm
1
此外,考虑将数据序列化为 JSON 等格式,而不是使用 shelve。 - jordanm
使用Python 3.6在本地主机上打开同一个文件可以无缝运行。因此我怀疑这不是版本问题。但是在使用Python:3.6 docker时又失败了。我可以明确将问题归结于Python在容器内运行。 - Michael
3.6 是一个重要版本。我的意思是,例如 3.6.2 vs 3.6.4。 - jordanm
抱歉我的评论不够明确。我的意思是,即使在主要版本之间,主机上的shelve文件也不会不兼容。我想我是说python版本在主机系统上并没有影响(问题只发生在docker容器内,与python版本无关),这让我得出结论,问题是由于docker化引起的。 - Michael
1个回答

0

@jordanm的评论之后,这很可能是由于缓存文件是使用不同的Python解释器版本创建的,而读取它的解释器版本不同。

确保您使用相同的解释器版本进行编写和读取。

在我的情况下,由于编写代码也是读取代码,因此仅删除缓存文件就足够了(从而使用正确的版本重新创建它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接