Seite 1 von 1

Prozessverwalten und Ausgabenkontrolle

Verfasst: Montag 25. Januar 2010, 16:52
von lordfinal
Hi,

ich will aus Auswertungsgruenden ein Programm ueber ein Pythonskript starten ( allerdings immer nur 1 soll zur gleichen Zeit aktiv / gestartet sein ) und aus der den Ausgaben des Programms will ich dann Berechnungen durchfuehren.

Code: Alles auswählen

import os


step = 1000
# Elemente Anzahl aendern
while step <= 100000000:
	
	for i in range(1,20):   
		prog = "echo"
		argument = str(i)
		os.system(prog + " " + " ".join(argument) + ">> ./output.txt")	
	step = step * 10

Hat jemand ne Ahnung wo ich weiter machen kann? Sollte ich statt os.system lieber einen subprocess benutzen? Oder sollte ich mittels Wait() warten bis der Process beendet ist?

Danke fuer Antworten

Verfasst: Montag 25. Januar 2010, 16:57
von problembär
Wenn Du die Programmausgabe abfangen willst, solltest Du "subprocess" verwenden.
In einfachen Fällen tut's meiner Meinung nach aber auch "os.popen()".

Gruß

Verfasst: Montag 25. Januar 2010, 21:00
von Trundle
Was sind denn einfache Fälle? `os.popen()` benutzt halt immer eine Shell, das mag man in der Regel vermeiden.

Verfasst: Dienstag 26. Januar 2010, 13:45
von lordfinal
Ich bin weitergekommen, aber ich haenge gerade daran, dass ich nicht abwarte, bis der ausgefuehrte Process fertig ist. Ich versuche es gerade mit Popen.communicate() aber ich bekomme eine Fehlermeldung, dass diese Funktion nicht bekannt sei. Was kann ich da machen?

Code: Alles auswählen

import os
import subprocess

step = 1000
# Elemente Anzahl aendern
while step <= 100000000:
	
	for i in range(1,20):   
		
		cmd = ["echo",str(step),str(i)]
		
		# Create output log file
		outFile = os.path.join(os.curdir, "output.log")
		outptr = file(outFile, "w+")

		# Create error log file
		errFile = os.path.join(os.curdir, "error.log")
		errptr = file(errFile, "w+")

		
		retval = subprocess.call(cmd, 0, None, None, outptr, errptr)
		#retval.wait()
               retval.communicate() 

		if not retval == 0:
			errData = errptr.read()
			errptr.close()

	  
	step = step * 10		
errptr.close()
outptr.close()

Verfasst: Mittwoch 27. Januar 2010, 17:37
von Trundle
`subprocess.call()` wartet eigentlich, bis der Prozess fertig ist. Es wird ja auch nur der Return-Code vom Prozess zurückgegeben und kein `Popen`-Objekt.