2015-05-18 25 views
16

La libreria Python tarfile non rileva un tar rotto.tar.extractall() non riconosce EOF inatteso

[email protected]$ wc -c good.tar 
143360 good.tar 

[email protected]$ head -c 130000 good.tar > cut.tar 

[email protected]$ tar -tf cut.tar 
... 
tar: Unexpected EOF in archive 
tar: Error is not recoverable: exiting now 

Molto bello, lo strumento della riga di comando riconosce un EOF imprevisto.

[email protected]$ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import tarfile 
>>> tar=tarfile.open('cut.tar') 
>>> tar.extractall() 

Non bello. La libreria Python decodifica il file, ma non solleva eccezioni.

Come rilevare EOF inatteso con la libreria Python? Voglio evitare il modulo subprocess.

Il parametro errorlevel non è di aiuto. Ho provato errorlevel = 1 e errorlevel = 2.

+0

bella cattura! dovresti prendere in considerazione l'apertura di un bug report e inviare la tua soluzione – knitti

+0

@knitti ho aperto un bug report: http://bugs.python.org/issue24259 – guettli

+0

Purtroppo non riesco ad aggiungere un po 'di bounty ad uno esistente ... – knitti

risposta

6

Ho scritto un lavoro. Funziona con i miei file tar. Suppongo che non supporti tutti i tipi di oggetti che possono essere memorizzati in un file tar.

# -*- coding: utf-8 -*- 
from __future__ import absolute_import, division, unicode_literals, print_function 
import os 
import tarfile 

class TarfileWhichRaisesOnEOF(tarfile.TarFile): 
    def extractall(self, path=".", members=None): 
     super(TarfileWhichRaisesOnEOF, self).extractall(path, members) 
     if members is None: 
      members = self 

     for tarinfo in members: 
      if not tarinfo.isfile(): 
       continue 
      file=os.path.join(path, tarinfo.name) 
      size_real=os.path.getsize(file) 
      if size_real!=tarinfo.size: 
       raise tarfile.ExtractError('Extracting %s: Size does not match. According to tarinfo %s and on disk %s' % (
        tarinfo, tarinfo.size, size_real)) 
1

Ciò è stato risolto in Python 3 - un OSError viene sollevato indipendentemente dall'impostazione errorlevel.

+0

Spiacente, nel mio caso l'impostazione del errorlevel non funziona. Questo significa che le modifiche a Python3 non saranno d'aiuto. – guettli

+0

@guettli: hai provato con 3.4? Si prega di aggiungere una nota a http://bugs.python.org/issue24259 dicendo così. –

+0

Ho provato a estrarre() il tar_which_is_cut.tar caricato con Python 3.4.0. Solleva un OSError - buono. Solo 2.7 interessati? – guettli