2010-01-19 5 views
2

J'essaye d'écrire un programme python qui finira par prendre un argument de ligne de commande d'un fichier, déterminer s'il s'agit d'un fichier tar ou zip, puis l'extraire en conséquence. J'essaie juste de faire fonctionner la partie goudron maintenant et j'ai plusieurs erreurs. Le fichier que je vérifie réside dans mon répertoire ~ /. Toutes les idées seraient géniales.Premier programme Python - Plusieurs erreurs

#!/usr/bin/python 

import tarfile 
import os 

def open_tar(file): 
    if tarfile.is_tarfile(file): 
     try: 
      tar = tarfile.open("file") 
      tar.extractall() 
      tar.close() 
     except ReadError: 
      print "File is somehow invalid or can not be handled by tarfile" 
     except CompressionError: 
      print "Compression method is not supported or data cannot be decoded" 
     except StreamError: 
      print "Is raised for the limitations that are typical for stream-like TarFile objects." 
     except ExtractError: 
      print "Is raised for non-fatal errors when using TarFile.extract(), but only if TarFile.errorlevel== 2." 

if __name__ == '__main__': 
    file = "xampp-linux-1.7.3a.tar.gz" 
    print os.getcwd() 
    print file 
    open_tar(file) 

Voici les erreurs. Si je commente l'erreur de lecture, je reçois également la même erreur sur la prochaine exception.

[email protected]:~$ python openall.py 
/home/tux 
xampp-linux-1.7.3a.tar.gz 
Traceback (most recent call last): 
    File "openall.py", line 25, in <module> 
    open_tar(file) 
    File "openall.py", line 12, in open_tar 
    except ReadError: 
NameError: global name 'ReadError' is not defined 
[email protected]:~$ 
+0

Eh bien, c'est vraiment, vraiment difficile à lire. Pourriez-vous regarder les conseils de mise en forme sur le côté droit de la page? Pourriez-vous alors utiliser le bouton '101010' pour formater vos messages de code et de traceback correctement? Si nous ne pouvons pas lire votre question, nous ne pouvons pas vous aider. –

+0

J'essaie, je l'ai en blocs je vois que tout est foiré. – Justin

+0

Pour mettre en forme du texte en tant que code sur Stack Overflow, préfixez toutes les lignes avec quatre espaces, c'est tout, pas besoin d'entourer le texte avec des balises. Cliquez sur modifier sur le message pour voir comment j'ai changé votre mise en forme. Il y a aussi un bouton de barre d'outils pratique que vous pouvez utiliser si vous sélectionnez le texte, et une touche de raccourci, Ctrl + K. –

Répondre

10

Vous pouvez clairement voir dans votre erreur, il déclare

NameError: global name 'ReadError' is not defined 

ReadError est pas un nom python global. Si vous regardez la documentation tarfile vous verrez que ReadError fait partie des exceptions de ce module. Donc dans ce cas, vous voudriez faire:

except tarfile.ReadError: 
    # rest of your code 

Et vous devrez faire la même chose pour le reste de ces erreurs. En outre, si toutes ces erreurs vont générer le même résultat (un message d'erreur de quelque sorte, ou un laissez-passer), vous pouvez simplement faire:

except (tarfile.ReadError, tarfile.StreamError) # and so on 

Au lieu de les faire chacun sur une ligne séparée. C'est seulement si elles vont donner la même exception

+0

Très bien, merci. Je savais que c'était dire que c'était indéfini, j'étais sûr que je devais préfixer avec. Merci. – Justin

+0

Ajout de cela a arrêté les erreurs. L'autre erreur était parce que j'avais la variable nommée une fois quand je n'avais pas besoin de le faire. – Justin

1

Je pense que vous pourriez avoir besoin de tarfile.ReadError plutôt que juste ReadError?

1

OK. Toutes vos exceptions (ReadError, CompressionError etc.) sont à l'intérieur du module tarfile et donc vous devrez dire except tarfile.ReadError au lieu de seulement except ReadError.

2

Vous devez utiliser except tarfile.ReadError ou bien utiliser from tarfile import is_tarfile, open, ReadError, CompressionError, etc. et le placer dans la fonction open_tar au lieu de globalement.

Questions connexes