Python mit Gnuplot.py synchronisieren

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
seadweller
User
Beiträge: 5
Registriert: Mittwoch 20. April 2011, 15:44

Hallo zusammen,

ich habe erst wenige Stunden Erfahrung mit Python und versuche gerade Gnuplot mit Python zu skripten. Ich habe einige dutzend Textdateien, welche ich an Gnuplot weiterreiche um Diagramme (über 200) zu erzeugen. Diese sollen als png abgespeichert werden.
Das klappt prinzipiell auch gut. Nur werden nicht alle Ausgabedateien erzeugt. Es fehlt immer eine variable Zahl an Files. Wenn ich nach den plot-Befehlen ein time.sleep() einbaue, reduziert sich die Fehlerquote. Ich vermute, dass das Pythonmodul die Kommandos sendet, diese aber von Gnuplot nicht gepuffert werden.

Folgende Befehle werden in einer Schleife ausgeführt:

g = Gnuplot.Gnuplot()
for...
g("set output '" + outf + "_MLI_1.png'")
d1 = Gnuplot.File(inf, using='2:4', title="4001")
d2 = Gnuplot.File('', using='2:5', title="4002")
d3 = Gnuplot.File('', using='2:6', title="4003")
g.plot(d1,d2,d3)
# time.sleep(1)

Hat jemand damit schon mal Erfahrung gesammelt, bzw. kann mir helfen? Kann ich irgendwie abfragen, ob Gnuplot den letzten Befehl vollständig ausgeführt hat?


Marcel
BlackJack

@seadweller: Soweit ich weiss gibt es keine Möglichkeit bei der API festzustellen ob gnuplot schon alles ausgeführt hat. Bei der `hardcopy()`-Funktion steht sogar in der Dokumentation, dass man "kurz warten" soll, weil es sonst passieren kann, das temporäre Datendateien gelöscht werden bevor gnuplot die verarbeitet hat. Was immer "kurz" jetzt auch konkret bedeuten mag. Ziemlich gruselige API an der Stelle.
seadweller
User
Beiträge: 5
Registriert: Mittwoch 20. April 2011, 15:44

@BlackJack: Danke für die schnelle Antwort! Das ist in der Tat ganz schön gruselig! Das 'sleep' liefert befriedigende Ergebnisse. Hatte nur gedacht, dass es da noch eine elegantere Möglichkeit gibt.
lunar

@seadweller: Ist es dann nicht vielleicht einfacher, gnuplot einfach mittels "subprocess" auszuführen?
seadweller
User
Beiträge: 5
Registriert: Mittwoch 20. April 2011, 15:44

@lunar: Meinst du mit os.popen() und dann über die write methode? Könnte ich auch noch mal probieren.

Möchte aber fast vermuten, dass ich da ähnliche Probleme habe, wenn ich die Kommandos zu schnell hintereinander ausführe. Möglichkeit wäre natürlich, den Prozess für jedes Diagramm neu zu starten. Aber dann müsste ich die ganzen Befehle zum initialisieren von Gnuplot auch wieder aufs neue ausführen. Es würde vermutlich aufs gleiche hinauslaufen, wenn ich für jedes Diagramm ein neues Gnuplot Objekt erzeuge und es anschließend wieder schließe
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

seadweller hat geschrieben:@lunar: Meinst du mit os.popen() und dann über die write methode? Könnte ich auch noch mal probieren.
Nein, mittels subprocess.
lunar

Dabei dürfte es auch keine Probleme geben, da Du bei "subprocess" auf das Ende des Unterprozesses warten kannst. Und logischerweise beendet sich der gnuplot-Prozess ja nicht, bevor er nicht mit dem Plotten und somit auch mit der Erzeugung der entsprechenden Ausgabedateien fertig ist :)
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Eine andere Möglichkeit wäre die Verwendung von Matplotlib oder eines anderen Python Plotting Tools.
seadweller
User
Beiträge: 5
Registriert: Mittwoch 20. April 2011, 15:44

Aber das würde ja bedeuten, ich muss nach jedem Plot einen neuen Subprozess mit Gnuplot starten. Würde ich nur einen Subprozess erzeugen und dann alle Diagramme hintereinander in diesem Kontext plotten, kann es mir wieder passieren, dass zwischendurch einige Plots unterschlagen werden.
Ich könnte aber vielleicht Gnuplot nach jedem Plot-Kommando anweisen, irgend ein Zeichen auf stdout zu schreiben. Das könnte ich abfragen und daraufhin erst den nächsten plot starten!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

seadweller hat geschrieben:Aber das würde ja bedeuten, ich muss nach jedem Plot einen neuen Subprozess mit Gnuplot starten.
Ja und wo ist das Problem? Unter Unices ist Prozesse erstellen billig, d.h. es macht kein großes Problem wenn du viele davon startest.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
seadweller
User
Beiträge: 5
Registriert: Mittwoch 20. April 2011, 15:44

Ja und wo ist das Problem? Unter Unices ist Prozesse erstellen billig, d.h. es macht kein großes Problem wenn du viele davon startest.
Ich muss mich an dieser Stelle als Windowsnutzer outen. Mein Programm ist ohnehin nicht zeitkritisch. Ob es nun 2 Sekunden oder 5 Minuten braucht ist mir erst mal egal.

Aber da ich Python erst vor zwei Tagen installiert habe, zielt meine Frage inzwischen auch mehr darauf ab, die Arbeitsweise mit Python zu verstehen und möglichst kompakten Programmcode zu erzeugen.

Aus meiner bisherigen programmierästhetischen Sicht erzeuge ich halt ein Objekt/Prozess, wickle damit die komplette Kommunikation ab und schließe es danach wieder.


Aber zwischendurch mal ein Danke für eure Antworten! :)
Antworten