Software puffert auf einmal Output - linuxbedingt?

ivka_sto

Grünschnabel
Hallo allerseits,

Ich habe soweit zahlreiche Foren durchforstet und ganz viele Posts gelesen, doch nichts gefunden, was mich auch einen Schritt weiterbringt - hoffentlich weiß einer von euch was :)

Also, ich hab was programmiert, das eine externe Software startet und ihr die nötigen Parameter und Input gibt - mein Skript kontrolliert den Ablauf einer Simulation, die Simulationssoftware rechnet, und gibt die Werte als Output zurück. Jetzt hab ich das Problem, daß - auf Linux ausgeführt - sich das ganze ziemlich schleppt, weil auf Linux untypischerweise der Output gepuffert wird und erst geschrieben wird, wenn die Simulationssoftware fertig ist mit Rechnen. Ich würde das sehr gern anders haben, doch ich habe mir sagen lassen, daß dies eine Sache zwischen Linux und der externen Anwendung sei, und sich kaum beeinflußen ließe - stimmt das? Gibt es vielleicht einen Umweg, auf den ich den Output simultan schreiben lassen kann?

Viele Grüße,
ivka_sto
 
Hi!

Da kann man was machen. Doch zuerst solltest Du uns wissen lassen, in welcher Sprache Du "was geschrieben hast"... ;)

Gruß
Enum
 
Ja, die externe Software wird über subprocess.popen gestartet:
Code:
simu = subprocess.popen(cmd, stderr = subprocess.PIPE)
simu.wait()
out_file = open('soundso', 'r')
out_content = out_file.readlines()
out_file.close()
for i in range (-1, -5, -1):
   k = out_content[i].strip()
   if (k.find('ExitNum') != -1):
      print 'exit number: ' + str(k[34:]).strip()
   else:
      pass
 
Ja, die externe Software wird über subprocess.popen gestartet:

simu = subprocess.popen(cmd, stderr = subprocess.PIPE)
simu.wait()
out_file = open('soundso', 'r')
out_content = out_file.readlines()
out_file.close()
for i in range (-1, -5, -1):
k = out_content.strip()
if (k.find('ExitNum') != -1):
print 'exit number: ' + str(k[34:-]).strip()
else:
pass

Ist das jetzt ein Scherz? Du rufst doch sogar explizit wait() auf und wartest erstmal bis die Anwendung beendet ist? Evtl. solltest du nochmal die Doku lesen...

Gruß

PS: Bitte verwende die entsprechenden Code-Tags ([code=python] ... [/code] für Python Code etc.)
 
Zuletzt bearbeitet von einem Moderator:
Nein, es ist kein Scherz. Mit wait() halte ich nur den Python-Skript an - das dürfte, meiner Meinung nach, das Schreiben der Output-Files in keinster Weise betreffen, da sie von der externen Anwendung generiert werden.

Das, was nach wait() steht (also das Lesen der Files) kommt an einer anderen Stelle, und der Code dazwischen hat mit meiner Frage nichts zu tun, deshalb hab ich den weggelassen.

Sorry für die Tags.
 
Nein, es ist kein Scherz. Mit wait() halte ich nur den Python-Skript an - das dürfte, meiner Meinung nach, das Schreiben der Output-Files in keinster Weise betreffen, da sie von der externen Anwendung generiert werden.
Also dauert es dir einfach zu lange bis die externe Anwendung fertig ist? Wie kommst du darauf das es mit einem Ausgabepuffer zu tun hat? Evtl. solltest du mal den Autor des ext. Programmes fragen warum es so lange braucht?!

Hast du mal die Systemauslastung und die I/O kontrolliert?

Gruß
 
Mit wait() halte ich nur den Python-Skript an - das dürfte, meiner Meinung nach, das Schreiben der Output-Files in keinster Weise betreffen, da sie von der externen Anwendung generiert werden.

Aber das Auslesen des Files wird beeinflusst.
Das outfile wird doch erst geöffnet wenn die Simulation durchgelaufen ist. Also ist es kein Wunder, dass dein Skript die Daten erst dann bekommt, da es sie gar nicht früher abruft. Die Frage ist nun ob das externe Programm die Ausgabe erst schreibt wenn es fertig ist (was wahrscheinlich ist) oder ständig schreibt was einfach nur imperformant wäre.

Ich denke du solltest die communicate methode des popen objects nutzen:

Code:
simu = subprocess.popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outcontent=""
while 1:
    print simu.communicate()[0] # communicate() returns a tuple (stdout,stderr)
    if whatever happens:
        break
 
Zuletzt bearbeitet:
Nein, auch nicht. Es stört mich, das der Output erst geschrieben wird, wenn die Simulationssoftware fertig gerechnet hat. Gerade weil einer der Entwickler gesagt hat, daß das untypisch sei, und es selber womöglich auf Linux geschoben hat - er hat gesagt, normalerweise wird der Output parallel mit dem Rechnen geschrieben. Dann könnte ich schon im Laufe der Rechnung einen Fehler erkennen, sonst rechnet das Programm weiter.

Hoffe die Beschriebung war jetzt genauer :)
 
Zurück