Seite 2 von 2

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 07:57
von feldmaus
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

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 08:26
von 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.

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 08:54
von feldmaus
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 \* ?

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 11:42
von 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.

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 15:34
von feldmaus
Also bin ich gezwungen die Option shell=True zu setzen? Und dann irgendwie hinfrickeln?

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 15:46
von sparrow
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".

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 16:08
von feldmaus
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.

Re: Exceptions abfangen und einbauen

Verfasst: Donnerstag 17. März 2011, 16:20
von feldmaus
Hiermit funktionierts, danke Anke .-)

Code: Alles auswählen

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