Seite 1 von 1

(Fehler-)meldung aus Subshell auswerten

Verfasst: Mittwoch 30. März 2005, 09:35
von Gast
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

Verfasst: Mittwoch 30. März 2005, 09:51
von CM
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

Verfasst: Mittwoch 30. März 2005, 11:00
von Leonidas
CM hat geschrieben:Versuche hierzu mal popen unter os oder popen2.
Oder gar subprocess. Wie du siehst, Möglichkeiten gibt es zuhauf.

Verfasst: Mittwoch 30. März 2005, 13:58
von CM
Oh ja, subprocess! Irgendwie tendiere ich dazu das zu übersehen, gut das Leonidas immer querliest, was ich so verzapfe. Danke.

Gruß,
Christian

Verfasst: Mittwoch 30. März 2005, 15:30
von Leonidas
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".

Re: (Fehler-)meldung aus Subshell auswerten

Verfasst: Mittwoch 30. März 2005, 22:07
von BlackJack
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.

popen2 beispiel

Verfasst: Dienstag 12. April 2005, 10:01
von mbierenfeld

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))

Re: popen2 beispiel

Verfasst: Dienstag 12. April 2005, 12:14
von joe
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

Re: popen2 beispiel

Verfasst: Dienstag 12. April 2005, 12:29
von mbierenfeld
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

Verfasst: Dienstag 12. April 2005, 12:35
von BlackJack
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.