ich stehe vor dem Rätsel, dass mein Code ein unterschiedliches Verhalten zeigt je nach dem, wie bzw. wo ich den Code laufen lasse.
Mein Ziel ist es, Eingaben an ein externes Programm (gnuplot) über eine Pipe zu schreiben und die Antworten von gnuplot während der Laufzeit aus einer Pipe zu lesen.
Mein Code:
Code: Alles auswählen
import subprocess
import thread
def pipelesen(pipe, liste) :
global Marker
Marker=0
while Marker==0:
liste.append(pipe.readline())
def threatbeenden (objekt):
global Marker
Marker=1
objekt.stdin.write('\n')
return objekt.communicate()
ausgabe=[]
g=subprocess.Popen('/usr/bin/gnuplot',
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
thread.start_new_thread(pipelesen,
(g.stdout, ausgabe))
g.stdin.write('se sam 1788\n')
g.stdin.write('sh sam\n')
print "ausgabe = ", ausgabe
print "Ergebnis von threatbeenden(g):"
print threatbeenden(g)
print "Marker = ", Marker
Starte ich den Code in Idle im normalen Modus, so erhalte ich:[DEBUG ON]
>>>
ausgabe = ['\n', '\tsampling rate is 1788, 1788\n', '\n']
Ergebnis von threatbeenden(g):
('', None)
Marker = 1
[DEBUG ON]
>>>
Schreibe ich den Code Zeilenweise in die interaktive Shell, so ist die Pipe ausgelesen und befindet sich in der Liste "ausgabe", das Beenden des Threads liefert aber den I/O-Fehler. "Marker" hat den Wert 1.>>>
ausgabe = []
Ergebnis von threatbeenden(g):
('\n\tsampling rate is 1788, 1788\n\n', None)
Unhandled exception in thread started by Marker =
Traceback (most recent call last):
1 File "/home/walter/Python_Skripte/script.py", line 9, in pipelesen
liste.append(pipe.readline())
>>> IOError: (0, 'Error')
Starte ich das Skript von der Kommandozeile aus mit "python script.py", so erhalte ich keine Fehlermeldung, "ausgabe" ist aber eine leere Liste. "Marker" hat meistens den Wert 0 und manchmal (ohne für mich erkennbares Muster) den Wert 1.
Ich schließe daraus, dass gnuplot seine Ausgaben ordentlich in die Pipe schreibt aber der Thread sich immer unterschiedlich verhält.
Hat vielleicht jemand eine Idee, warum der Code so unterschiedlich interpretiert wird und wie ich den Code verändern muss damit er sich nicht nur im Debug-Modus richtig verhält?[/code]