Exceptions abfangen und einbauen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Weitere Änderung, hier der Link zum kompletten http://pastebin.com/DnerJz7d. Ich bekomme die Fehlermeldung:

Code: Alles auswählen

Sichern/Zurueckspielen/Nichts von /home/markus/.VirtualBox/ ohne Snapshots (s/z/N)? s
source ist: /home/markus/.VirtualBox/
target ist: markus@feld-server:/home/markus/VirtualBox@feld-server/
rsync: --exclude Machines/Standard/Snapshots/*: unknown option
rsync error: syntax or usage error (code 1) at main.c(1443) [client=3.0.7]
Der Dictionary Eintrag sieht wie folgt aus:

Code: Alles auswählen

            '.virtualbox':{'Benutzer':['markus', 'maria', 'bernard', 'kaiserbert'], 
                'Frage':[' von /home/', '/.VirtualBox/ ohne Snapshots (s/z/N)? '],
                'Exclude':'--exclude Machines/Standard/Snapshots/*',
                'Client':['/home/', '/.VirtualBox/'],
                'Server':['@'+SERVER+':/home/', '/VirtualBox@'+SERVER+'/']}, 
Und der Ausschnitt vom entscheidenden Code:

Code: Alles auswählen

    for eintrag in katalog:
        for BENUTZER in katalog[eintrag]['Benutzer']:
            antwort2=raw_input('Sichern/Zurueckspielen/Nichts'+katalog[eintrag]['Frage'][0]+BENUTZER+katalog[eintrag]['Frage'][1])
            exclude=katalog[eintrag]['Exclude']
            if antwort2 == ('s' or 'S') :
                try:
                    source=katalog[eintrag]['Client'][0]+BENUTZER+katalog[eintrag]['Client'][1]
                    target=BENUTZER+katalog[eintrag]['Server'][0]+BENUTZER+katalog[eintrag]['Server'][1]
                    print 'source ist: '+source
                    print 'target ist: '+target
                    subprocess.call(['rsync',
                    '--rsh=ssh -l '+BENUTZER,
                    '-a',
                    '--delete-after',
                    '--stats',
                    exclude,
                    source,
                    target])
                except Exception,  e:
                    print 'Fehler: '+str(e)
Ich denke das Sternchen bei Exclude macht Probleme, was meint Ihr? Ich glaube das muss ich aber mit angeben?

Grüße Markus
BlackJack

@feldmaus: Es gibt bei ``rsync`` keine Option die `--exclude Machines/Standard/Snapshots/*` heisst. Du übergibst das als *ein* Argument, es sind aber zwei, nämlich die Option '--exclude' und der Wert dazu 'Machines/Standard/Snapshots/*'. Wenn das bisher über so über eine Shell funktioniert hat, dann hattest Du Glück, denn den Stern hättest Du vor der Shell schützen müssen. Das ging nur gut, weil auf das Glob-Muster nichts gepasst hat und die Shell das nicht expandiert hat.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich dachte er überprüft das nicht, dann ist das doch egal? Übergeben wird doch nur eine Zeichenkette und ob ich eine oder zwei zeichenketten übergebe und diese dann wieder zusammenbastle wird doch eh nicht überprüft?

Ich habe exclude jetzt wie folgt umgeändert:

Code: Alles auswählen

'Exclude':'--exclude=\'Machines/Standard/Snapshots/*\'',
EDIT: funktioniert noch nicht ganz, irgendwas mache ich falsch muss ich das Sternchen mit maskieren, also \* ?
Zuletzt geändert von feldmaus am Donnerstag 17. März 2011, 11:47, insgesamt 1-mal geändert.
BlackJack

@feldmaus: Das was Du jetzt machst wäre richtig, wenn es vorher noch von einer Shell interpretiert würde. Die würde die Anführungszeichen aber entfernen.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Also bin ich gezwungen die Option shell=True zu setzen? Und dann irgendwie hinfrickeln?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Nein. Wenn ich BlackJack richtig verstehe sollst du einfach nur das Argument in 2 Unterteilen. Nämlich in die Option --exclude und dei Zeichenkette "/pfad".
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich habe das ganze abgeändert und übergebe zwei Argumente statt nur einem für exlude:

Code: Alles auswählen

            exclude_pre=katalog[eintrag]['Exclude'][0]
            exclude_post=katalog[eintrag]['Exclude'][1]
Mein Eintrag für Exclude habe ich auch abgeändert:

Code: Alles auswählen

                'Exclude':['--exclude', '\'Machines/Standard/Snapshots/*\''],
Der subprocess sieht nur wenig verändert aus:

Code: Alles auswählen

                    subprocess.call(['rsync',
                    '--rsh=ssh -l '+BENUTZER,
                    '-a',
                    '--delete-after',
                    '--stats',
                    '--progress', 
                    exclude_pre,
                    exclude_post,
                    source,
                    target])
exclude_pre enthält dann den String --exclude und exclude_post den String 'Machines/Standard/Snapshots/*' zumindest laut meinem Debugger in Eric. Nur kopieren tut er trotzdem die ausgenommenen Dateien.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hiermit funktionierts, danke Anke .-)

Code: Alles auswählen

                'Exclude':['--exclude', 'Machines/Standard/Snapshots/*'],
Antworten