Seite 1 von 1

Auf das Ende eines Subprozesses warten

Verfasst: Donnerstag 7. September 2006, 14:07
von Necoro
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

Verfasst: Donnerstag 7. September 2006, 14:26
von akis.kapo
Keine Ahnung.

man tee.

PS: gEnToO rOCKS!

Verfasst: Donnerstag 7. September 2006, 20:39
von Michael Schneider
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

Verfasst: Donnerstag 7. September 2006, 21:42
von Necoro
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

Verfasst: Freitag 8. September 2006, 08:07
von Rebecca
Koenntest du mal einen moeglichst kurzen, aber lauffaehigen Code posten?

Verfasst: Freitag 8. September 2006, 12:39
von Joghurt
emerge ist doch auch in Python geschrieben, evtl. kannst du es einfach als Modul importieren und dann die gewünschten Funktionen direkt aufrufen.

Re: Auf das Ende eines Subprozesses warten

Verfasst: Freitag 8. September 2006, 12:44
von mitsuhiko
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)

Verfasst: Freitag 8. September 2006, 13:42
von Necoro
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 :)

Verfasst: Freitag 15. September 2006, 19:38
von Necoro
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?

Verfasst: Freitag 15. September 2006, 23:17
von Necoro
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)