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
Python mit Gnuplot.py synchronisieren
@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.
-
- 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.
@seadweller: Ist es dann nicht vielleicht einfacher, gnuplot einfach mittels "subprocess" auszuführen?
-
- 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
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
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nein, mittels subprocess.seadweller hat geschrieben:@lunar: Meinst du mit os.popen() und dann über die write methode? Könnte ich auch noch mal probieren.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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
Eine andere Möglichkeit wäre die Verwendung von Matplotlib oder eines anderen Python Plotting Tools.
-
- 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!
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!
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.seadweller hat geschrieben:Aber das würde ja bedeuten, ich muss nach jedem Plot einen neuen Subprozess mit Gnuplot starten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 5
- Registriert: Mittwoch 20. April 2011, 15:44
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.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.
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!