Seite 1 von 1

komischer Effekt bei os.popen

Verfasst: Montag 1. März 2010, 16:02
von bankkind
Hallo zusammen,

ich habe ein Skript geschrieben bei dem ich os.popen nutze um wiederrum ein anderes Skript aufzurufen. Hoert sich nach ziemlicher frickelei an... und das ist es auch.

Nichts destotrotz ist mir aufgefallen, dass wenn ich mit popen ein korruptes Statement absetze, dass mein Skript trotzdem durchlaeuft und keinen Fehler wirft. Auch mit Try... Except und sys.exc_info() wurde mir kein Fehler ausgegeben.

Wie komme ich an den Fehlercode bzw. an die Rueckgabe der Shell?

VG
bankkind

Verfasst: Montag 1. März 2010, 16:19
von Barabbas
Hallo!

Allgemein wird empfohlen, satt os.popen() subprocess.Popen() zu verwenden. Auf dieser Seite findest du mehr dazu: http://docs.python.org/library/subprocess.html

Ganz unten findet sich auch ein hilfreiches Beispiel:

Code: Alles auswählen

p = Popen("cmd", shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
 child_stdout,
 child_stderr) = (p.stdin, p.stdout, p.stderr)
Du kannst nun mit p.stderr.read() die ausgegebenen Fehler lesen. Mit p.stdout.read() kommst du an die normale Rückgabe.

Wenn du nur den Rückgabewert eines aufgerufenen Programmes brauchst, reicht manchmal schon subprocess.call().

Schöne Grüße,

brb

Verfasst: Montag 1. März 2010, 16:35
von Dav1d
wenn deinem Prgramm "inputs" geben willst, kannst du Popen.communicate() verwenden (Rückgabe erst wenn der Prozess beendet ist) oder stdin.write() kombiniert mit stdout.readlines()

Verfasst: Montag 1. März 2010, 17:03
von bankkind
ok, ich habe mir schon gedacht dass ihr mich zu subprocess ueberreden wollt. Aber gibt es auch eine Moeglichkeit os.popen zu verwenden?

ich muesste ne ziemliche menge umschreiben um subprocess zu integrieren.

Verfasst: Montag 1. März 2010, 17:09
von lunar
@bankkind: Dann schreibe es um.

@dav1d: Wenn man nicht ".communicate()", sondern direkt ".stdout" und ".stdin" verwendet, muss man das sehr sorgfältig tun, da man so schnell ein Deadlock produzieren kann, wenn der Puffer der Pipe voll läuft.

Verfasst: Dienstag 2. März 2010, 16:01
von Dav1d
Klar, aber manchmal geht's nicht anders!

http://docs.python.org/library/subproce ... ess-module

Verfasst: Dienstag 2. März 2010, 18:02
von lunar
@Dav1d: Was willst Du mir jetzt damit sagen?

Verfasst: Mittwoch 3. März 2010, 14:07
von Dav1d
@lunar, ich will damit sagen, dass es manchmal ein Muss ist, direkt von stdout zu lesen und in stdin zu schreiben, um meinen vorherigen Beitrag zu "rechtfertigen"