Java python tarfile.py“;无法成功打开文件";
我有一个tarball无法使用python打开:Java python tarfile.py“;无法成功打开文件";,java,python,python-2.7,maven-assembly-plugin,Java,Python,Python 2.7,Maven Assembly Plugin,我有一个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 c
>>> 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
我已经跟踪了pythontarfile
code,有一个函数“nti
”,它们在其中转换字节。到了这一行:
obj.uid = nti(buf[108:116])
爆炸了。这些位(用于UID)以八个空格的形式通过。不确定从这里走到哪里…老实说,这个bug似乎在
tarfile.py
的nti
函数中:
n = int(nts(s) or "0", 8)
直通逻辑(或“0”
)不起作用,因为s
是空格,而不是None
,所以int()
爆炸
我从/var/lib/python2.7/
复制了tarfile.py
,并用try/catch包装了这一行,解决了我的问题:
try:
obj.uid = nti(buf[108:116])
except InvalidHeaderError:
obj.uid = 0
不过,这是一个黑客解决方案。实际上,我更希望python的人看看它并修复“或“0”
逻辑
更新
原来tarball是由刚刚升级到Java 7的Java 6项目中的
maven assembly插件创建的。通过将maven assembly插件升级到2.5.3
解决了这个问题,所以tar文件已损坏?偏移量为108到116的非数字将取消它作为tar文件的资格。@E如果我们将“腐败”的定义更改为“是否打开文件?”?“那么不,它没有损坏。:-)@EugeneK我完全同意你的观点,从python可能遵循规范的角度来看,这个文件的行为不正确。另一方面如果您没有设置UID和GID位?这是否意味着python会致命地崩溃?似乎反应过度。我不确定除了抛出异常之外还有什么其他选择。你只能猜这么多。GNU Tar Util的工作方式确实不同,而且更安全。例如,Tar规范说它必须是512对齐的(我想,或者它必须在512 0中结束),如果不是这样,很多事情都会失败,但GNU Tar Util仍然有效。@Inahutshellus我认为如果你没有设置UID和GID位,那么它必须为每一个设置任意8位,否则,报头未对齐,Deachiver必须猜测数据的起始位置,即仍然是512英寸或更早?可能是zlib上的编译错误。
try:
obj.uid = nti(buf[108:116])
except InvalidHeaderError:
obj.uid = 0