Auf das Ende eines Subprozesses warten

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
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Hey ... ich habe das Problem, dass ich per subprocess.Popen einen Befehl ausführe. Den Output des Befehls sende ich an ein virtuelles Terminal. Nun möchte ich warten bis dieser Prozess beendet ist - der Output soll aber trotzdem angezeigt werden.

Also kam ich auf die Idee, das mit Popen(...).wait() zu machen. (ja ich weiß, dass der Output da nicht angezeigt wird - aber das hätte man denn bestimmt in einen anderen Thread auslagern können oder so). Leider wird denn noch nicht einmal der Subprozess ausgeführt ... Hat jemand eine Idee, wie man das ändern könnte?

Bisheriger Code:

Code: Alles auswählen

def _emerge (self, options, it):
		"""Calls emerge and updates the terminal."""
		# open pty
		(master, slave) = pty.openpty()
		self.process = Popen("emerge "+options, stdout = slave, stderr = STDOUT, shell = True)
		self.remove_all(it)
		self.console.set_pty(master)
		self.process.wait()
Hinweis: self.console ist ein vte-terminal
Inter Deum Et Diabolum Est!
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Keine Ahnung.

man tee.

PS: gEnToO rOCKS!
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi Necoro,

sieh Dir mal die Hilfe zur os-Modul Methode waitpid durch, damit kannst Du gezielt auf das Ende eines Prozesses warten:
waitpid(...)
waitpid(pid, options) -> (pid, status << 8 )

Wait for completion of a given process. options is ignored on Windows.
Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

hey michael: mit os.waitpid passiert leider das gleiche wie mit Popen.wait :/ ... ich kam jetzt auf die Idee, das wait in einen extra Thread auszulagern ... aber der springt komischerweise zu Zeiten an, wo ich es nicht erwarte ... ich habe das Gefühl, dass da was nicht i.O. ist mit dem Prozess
Inter Deum Et Diabolum Est!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Koenntest du mal einen moeglichst kurzen, aber lauffaehigen Code posten?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

emerge ist doch auch in Python geschrieben, evtl. kannst du es einfach als Modul importieren und dann die gewünschten Funktionen direkt aufrufen.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Necoro hat geschrieben:Bisheriger Code:

Code: Alles auswählen

def _emerge (self, options, it):
		"""Calls emerge and updates the terminal."""
		# open pty
		(master, slave) = pty.openpty()
		self.process = Popen("emerge "+options, stdout = slave, stderr = STDOUT, shell = True)
		self.remove_all(it)
		self.console.set_pty(master)
		self.process.wait()
Unabhängig davon, würd ich das so machen:

Code: Alles auswählen

self.process = Popen(["emerge"] + options, stdout = slave, stderr = STDOUT, shell = True)
dann übernimmt subprocess das escaping. (options muss dann aber eine liste sein)
TUFKAB – the user formerly known as blackbird
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Joghurt hat geschrieben:emerge ist doch auch in Python geschrieben, evtl. kannst du es einfach als Modul importieren und dann die gewünschten Funktionen direkt aufrufen.
hmmm ... mal gucken wie gut das geht ... will nur nicht das Risiko eingehen, Mist zu bauen wegen falschem Aufruf oder so

@blackbird: ok - danke :)
Inter Deum Et Diabolum Est!
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

ok ... emerge als Funktion aufrufen geht nicht ... da sie sys.exit() aufrufen ... man könnte es höchstens überschreiben ... aber dann wirds langsam Pfusch *find* ... keiner ne Idee für obiges Problem?
Inter Deum Et Diabolum Est!
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

ok ... hab das ganze jetzt mit einem Thread gelöst ... konnte aber nicht das threading-Modul nehmen, weil das irgendwie Mist baut, sondern musste mir selber eins schreiben (siehe im Showcase-Forum)
Inter Deum Et Diabolum Est!
Antworten