(Fehler-)meldung aus Subshell auswerten

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
Gast

Mittwoch 30. März 2005, 09:35

Hallo,

wie kann ich Meldungen aus einer Subshell auswerten. Zum Beispiel, wenn ich über folgenden Befehl ein nicht leeres Directory löschen möchte:

Code: Alles auswählen

os.system("rmdir c:\nichtleeresDirectory")
und wenn ich gerade mal hier bin:

Gibt es eine elegante Pythonlösung (ohne system()) zum Löschen eines nicht leeren Directorie-Baumes ?

Gruß Hartmut
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 30. März 2005, 09:51

Hoi Hartmut,

zunächst zur zweiten Frage: Schau Dir mal das Modul os an. Dort finden sich so ziemlich alle File- und Directory-Manipulatoren, die man sich wünschen kann.

Zur eigentlichen Frage: Was Du möchtest ist einen Prozess starten (nichts anderes ist ja rm oder rmdir) und allen Output bei Dir auf der Shell (oder in einem beliebigen anderen Stream) wiederfinden. Versuche hierzu mal popen unter os oder popen2.

Gruß,
Christian
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. März 2005, 11:00

CM hat geschrieben:Versuche hierzu mal popen unter os oder popen2.
Oder gar subprocess. Wie du siehst, Möglichkeiten gibt es zuhauf.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 30. März 2005, 13:58

Oh ja, subprocess! Irgendwie tendiere ich dazu das zu übersehen, gut das Leonidas immer querliest, was ich so verzapfe. Danke.

Gruß,
Christian
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 30. März 2005, 15:30

CM hat geschrieben:Oh ja, subprocess! Irgendwie tendiere ich dazu das zu übersehen, gut das Leonidas immer querliest, was ich so verzapfe. Danke.
War ja nicht falsch, man kann genausogut os.popen oder popen2 verwenden. Nur subprocess ist halt "moderner".
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Mittwoch 30. März 2005, 22:07

Gast hat geschrieben:Gibt es eine elegante Pythonlösung (ohne system()) zum Löschen eines nicht leeren Directorie-Baumes ?
Jup, gibt es: `shutil.rmtree()` ist genau dazu da.
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

Dienstag 12. April 2005, 10:01

Code: Alles auswählen

        cmd = popen2.Popen4 (command)
        err = cmd.wait ()

        if err:

            message = "command [%s] failed with %d strerror [%s] stderr, stdout [%s]" % \
                (command, err, os.strerror(err), cmd.fromchild.read ())

            logger.error (message)

            if self.abandoned:

                newname = self.abandoned + "/" + self.filenamepart
                moveerr = os.rename (self.filename, newname)
                if moveerr:
                    logger.error ("cannot move [%s] to [%s]" % (self.filename, newname))
joe

Dienstag 12. April 2005, 12:14

mbieren hat geschrieben:

Code: Alles auswählen

        cmd = popen2.Popen4 (command)
        err = cmd.wait ()
        if err:


[...]


                moveerr = os.rename (self.filename, newname)
                if moveerr:
Wo hast du denn das snippet her? Der code ist völliger blödsinn ('tschuldigung). Weder ist der rückgabewert von Popen4.wait() wahr, wenn ein fehler auftritt, noch gibt os.rename() irgendwas zurück (außer none). Also nochmal die doku konsulieren.
joe
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

Dienstag 12. April 2005, 12:29

Wo hast du denn das snippet her? Der code ist völliger blödsinn ('tschuldigung). Weder ist der rückgabewert von Popen4.wait() wahr, wenn ein fehler auftritt, noch gibt os.rename() irgendwas zurück (außer none). Also nochmal die doku konsulieren.
joe
Huh ? Also dann frage ich mich weshalb es funktioniert. Der Kommando muß natürlich den exit () richtig machen. Merke "true" = Fehler 0 = gut

wait()

Waits for and returns the status code of the child process. The status code encodes both the return code of the process and information about whether it exited using the exit() system call or died due to a signal. Functions to help interpret the status code are defined in the os module; see section 6.1.5 for the W*() family of functions.

Bei rename gebe ich dir allerdings recht. :-)

Moment Nachtrag :-) Nimm halt ein gescheites BS und nicht windows. Bei denen ist 0 immer gleich Fehler
Zuletzt geändert von mbierenfeld am Dienstag 12. April 2005, 12:36, insgesamt 1-mal geändert.
BlackJack

Dienstag 12. April 2005, 12:35

Der Rückgabewert von `wait()` ist im Allgemeinen "wahr" wenn ein Fehler auftritt, es wird nämlich der Status des beendeten Programms zurückgegeben und der ist normalerweise 0 also "falsch" wenn alles glatt lief und ungleich 0 wenn ein Fehler aufgetreten ist, oder das aufgerufene Programm etwas anderes signalisieren wollte.
Antworten