komischer Effekt bei os.popen

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
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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()
the more they change the more they stay the same
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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.
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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Klar, aber manchmal geht's nicht anders!

http://docs.python.org/library/subproce ... ess-module
the more they change the more they stay the same
lunar

@Dav1d: Was willst Du mir jetzt damit sagen?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@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"
the more they change the more they stay the same
Antworten