(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.
Gast

(Fehler-)meldung aus Subshell auswerten

Beitragvon 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:

Beitragvon CM » 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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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:

Beitragvon CM » 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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Re: (Fehler-)meldung aus Subshell auswerten

Beitragvon 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

popen2 beispiel

Beitragvon mbierenfeld » 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

Re: popen2 beispiel

Beitragvon 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

Re: popen2 beispiel

Beitragvon mbierenfeld » 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

Beitragvon 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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]