我有一个无法使用python打开的tarball:
>>> 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)通过八个空格。不知道从哪里开始...
答案 0 :(得分:1)
老实说,这个错误似乎在tarfile.py
的{{1}}函数中:
nti
直通逻辑(n = int(nts(s) or "0", 8)
)无效,因为or "0"
是空格而不是s
,因此None
会爆炸。
我从int()
复制了tarfile.py
并用try / catch包裹了该特定行,这使我感到困惑:
/var/lib/python2.7/
但这是一个黑客解决方案。我真的更喜欢python民众看一看并修复了“ try:
obj.uid = nti(buf[108:116])
except InvalidHeaderError:
obj.uid = 0
逻辑。
<强>更新强>
原来,tarball是由刚刚升级到Java 7的Java 6项目中的or "0"
创建的。通过将maven-assembly-plugin
升级到maven-assembly-plugin
来解决问题。 / p>