python tarfile.py "file could not be opened successfully"

python tarfile.py "file could not be opened successfully"

我有一个 tarball,我无法使用 python:

打开
>>> import tarfile
>>> tarfile.open('/tmp/bad.tar.gz')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tarfile.py", line 1672, in open
    raise ReadError("file could not be opened successfully")
tarfile.ReadError: file could not be opened successfully

但我可以在命令行中毫无问题地提取文件。

$ tar -xzvf /tmp/bad.tar.gz

我已经跟踪了 python tarfile 代码,并且有一个函数“nti”,它们在其中转换字节。它到达这一行:

obj.uid = nti(buf[108:116])

然后爆炸。这些位(对于 UID)以八个空格的形式出现。不知道从这里去哪里...

老实说,这个错误看起来像是在 tarfile.pynti 函数中:

n = int(nts(s) or "0", 8)

fall-through 逻辑 (or "0") 不起作用,因为 s 是空格,而不是 None,所以 int() 爆炸了。

我从 /var/lib/python2.7/ 复制了 tarfile.py 并用 try/catch 包裹了那一行,这让我修复了:

    try:
        obj.uid = nti(buf[108:116])
    except InvalidHeaderError:
        obj.uid = 0

不过,这是一个 hack 解决方案。真的,我更希望 python 人看一看并修复“or "0" 逻辑。

更新

原来 tarball 是由 maven-assembly-plugin 在刚刚升级到 Java 7 的 Java 6 项目中创建的。升级 [=21] 解决了这个问题=] 到 2.5.3.