unbekannte Verwendung von subprocess

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.
Antworten
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hi Leute,

für mein Backup-Skript wollte ich den Python Befehl subprocess verwenden, weiß aber nicht genau wie dieser richtig verwendet wird. Oder ich mache was falsch. Es geht nach Ausführung von subprocess.Popen ein Fenster auf, wo ich gefragt werde ob dieser Prozess als Vater- oder Kind-Fork gestartet werden soll. Welche Antwort ist richtig und wie unterdrücke ich diese Frage?

EDIT:
Hier ein der entscheidende Ausschnitt:

Code: Alles auswählen

for eintrag in katalog:
    for BENUTZER in katalog[eintrag]['Benutzer']:
        antwort=raw_input('Sichern/Zurueckspielen/Nichts'+katalog[eintrag]['Frage'][0]+BENUTZER+katalog[eintrag]['Frage'][1])
        if antwort == ('s' or 'S') :
            try:
                subprocess.Popen(shlex.split('rsync --rsh="ssh -l '+BENUTZER+'" -avz --delete-after  --progress --stats '+katalog[eintrag]['Exclude']+' '+katalog[eintrag]['Lokal'][0]+BENUTZER+katalog[eintrag]['Lokal'][1]+' '+BENUTZER+katalog[eintrag]['Server'][0]+BENUTZER+katalog[eintrag]['Server'][1])).wait()
            except:
                print 'Unbekannter Fehler.'
        elif antwort == ('z' or 'Z'):
            try:
                subprocess.Popen(shlex.split('rsync --rsh="ssh -l '+BENUTZER+'" -avz --delete-after  --progress --stats '+katalog[eintrag]['Exclude']+' '+BENUTZER+katalog[eintrag]['Server'][0]+BENUTZER+katalog[eintrag]['Server'][1]+' '+katalog[eintrag]['Lokal'][0]+BENUTZER+katalog[eintrag]['Lokal'][1])).wait()
            except:
                print 'Unbekannter Fehler.'
        else:
            print 'Tue nichts. Weiter.'
katalog ist lediglich ein Dictionary mit den Daten die ich benötige für rsync. Weiterhin wollte ich die Fehler abfangen. Wie macht man das?

Grüße Markus
Zuletzt geändert von feldmaus am Mittwoch 12. Januar 2011, 01:13, insgesamt 3-mal geändert.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Keine Ahnung, allerdings mag ich ein paar Worte zu dem Code sagen:

Code: Alles auswählen

raw_input(AUSWAHL[0]+'/'+AUSWAHL[1]+'/Nichts'+katalog[eintrag]['Frage'][0]+BENUTZER+katalog[eintrag]['Frage'][1])
Schau dir mal String Processing im Tutorial an [1].

Code: Alles auswählen

if antwort == ('s' or 'S') :
Du meintest sicher

Code: Alles auswählen

if antwort in 'sS'
.

Code: Alles auswählen

except:
                print 'Unbekannter Syntax Fehler.', rueckgabe
Niemals alle Exceptions abfangen, immer angeben welche erwartet werden. Vor allem wird da sicherlich kein Syntax-Fehler auftreten, denn dann würde das Programm gar nicht starten.

[1] http://tutorial.pocoo.org/inputoutput.html
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Wenn ich das except wegnehme, meckert er rum.

Ich würde gerne die Zusammenfassungen und die Fehlermeldungen in eine LOG-Datei schreiben. Was ist an meinem String verkehrt?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

feldmaus hat geschrieben:Wenn ich das except wegnehme, meckert er rum.
Naja, das ist ja auch Sinn der Sache ;-)

Vielleicht meckert "er" ja aus gutem Grunde rum, bzw. aus einem Grund, den Du nicht behandelst bzw. der für einen Fehler verantwortlich ist, den Du so nicht finden kannst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

feldmaus hat geschrieben:Hi Leute,

für mein Backup-Skript wollte ich den Python Befehl subprocess verwenden, weiß aber nicht genau wie dieser richtig verwendet wird. Oder ich mache was falsch. Es geht nach Ausführung von subprocess.Popen ein Fenster auf, wo ich gefragt werde ob dieser Prozess als Vater- oder Kind-Fork gestartet werden soll. Welche Antwort ist richtig und wie unterdrücke ich diese Frage?
Grüße Markus
Du könntest deine aufrufe mal etwas verschönern, dann werden sie auch leserlich.
z.B so:

Code: Alles auswählen

subprocess.Popen(
    shlex.split('rsync --rsh="ssh -l {0}" -avz --delete-after --progress --stats {Exclude} \
        {Lokal[0]}{0}{Lokal[1]} {0}{Server[0]}{0}{Server[1]}'.format(BENUTZER, **katalog[eintrag]))
    ).wait()
Zum anderen die Abfrage wie der Prozess gestartet wird? Wie sieht das aus? Text? GUI?
Windows / Linux? Löst der befehl die Frage auch sonst aus?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Überhaupt würde ich da gar kein shlex verwenden. Welche Sinn macht es denn, Werte in einen String zu tun, nur den danach gleich wieder aufzuteilen? Würde doch viel mehr Sinn machen, den Befehl gleich als Liste anzugeben, dann müsste man da auch kein String Formatting machen.
Antworten