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.py
的 nti
函数中:
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
.
我有一个 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.py
的 nti
函数中:
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
.