@snafu: Ich ging jetzt von Unix aus, da können Login-Namen keine Leerzeichen enthalten.
Es geht dort bei dem Benutzernamen nicht um ein Argument für das Programm, sondern dem Programm wird an der Stelle eine Zeichenkette mit einem Programmaufruf für ein anderes Programm als *ein* Argument übergeben!
Exceptions abfangen und einbauen
Das könnte man dann doch auch in zwei Zeilen Schreiben:BlackJack hat geschrieben:Code: Alles auswählen
... return_code = subprocess.Popen( [ 'rsync', '--rsh=ssh -l ' + BENUTZER, # Assumes login names contain no whitespace. ...] ).wait()
Code: Alles auswählen
...
return_code = subprocess.Popen(
[
'rsync',
'--rsh="ssh',
'-l',
BENUTZER,
...]
).wait()
Ich glaube subprocess.Popen funktioniert anders als ich mir das gerade vorstelle?
@feldmaus: Nein, so könnte man das nicht schreiben. "--rsh='ssh -l benutzer'" ist ein Argument und muss folglich auch zusammen in der Liste stehen.
Also wird Argument für Argument auf Korrektheit überprüft?lunar hat geschrieben:@feldmaus: Nein, so könnte man das nicht schreiben. "--rsh='ssh -l benutzer'" ist ein Argument und muss folglich auch zusammen in der Liste stehen.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Es wird gar nichts ueberprueft. Ein Listenelement enthaelt ein Argument fuer den Aufruf und das `--rsh` Argument ist nunmal ein kompletter Programmaufruf bis hin zum Benutzer.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Weitere Änderung, hier der Link zum kompletten http://pastebin.com/DnerJz7d. Ich bekomme die Fehlermeldung:
Der Dictionary Eintrag sieht wie folgt aus:
Und der Ausschnitt vom entscheidenden Code:
Ich denke das Sternchen bei Exclude macht Probleme, was meint Ihr? Ich glaube das muss ich aber mit angeben?
Grüße Markus
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]
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+'/']},
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)
Grüße Markus
@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.
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:
EDIT: funktioniert noch nicht ganz, irgendwas mache ich falsch muss ich das Sternchen mit maskieren, also \* ?
Ich habe exclude jetzt wie folgt umgeändert:
Code: Alles auswählen
'Exclude':'--exclude=\'Machines/Standard/Snapshots/*\'',
Zuletzt geändert von feldmaus am Donnerstag 17. März 2011, 11:47, insgesamt 1-mal geändert.
@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.
Ich habe das ganze abgeändert und übergebe zwei Argumente statt nur einem für exlude:
Mein Eintrag für Exclude habe ich auch abgeändert:
Der subprocess sieht nur wenig verändert aus:
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.
Code: Alles auswählen
exclude_pre=katalog[eintrag]['Exclude'][0]
exclude_post=katalog[eintrag]['Exclude'][1]
Code: Alles auswählen
'Exclude':['--exclude', '\'Machines/Standard/Snapshots/*\''],
Code: Alles auswählen
subprocess.call(['rsync',
'--rsh=ssh -l '+BENUTZER,
'-a',
'--delete-after',
'--stats',
'--progress',
exclude_pre,
exclude_post,
source,
target])
Hiermit funktionierts, danke Anke .-)
Code: Alles auswählen
'Exclude':['--exclude', 'Machines/Standard/Snapshots/*'],