ich habe folgendes Problem:
Ich möchte mit python3 in einem Thread ein C-Programm starten und während dieses läuft dessen Ausgabe (stdout) auswerten und ggf. Eingaben per Script an das Programm senden (stdin).
Das C-Programm steuert ein RFID-Lesegerät und liest dort die ID von den Tags aus. Ich habe mich schon auf anderen Webseiten umgesehen (stackoverflow, python3 doku, etc.), konnte aber nichts dazu finden was mir weiterhilft.
Die meisten Code-Snippets die ich so gefunden habe, gehen davon aus, dass man subprocess.communicate() benutzt. Das geht hier aber nicht, da die Ausgabe vom C-Programm nie abgeschlossen ist (es soll quasi für immer laufen, solange das python Programm läuft). Da die Anwendung auch eine QT GUI besitzt, habe ich hier QThread verwendet.
Hier ist der Code vom Thread, soweit wie ich gekommen bin:
Code: Alles auswählen
...
class scanThread(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
self.pause = False
self.exitthread = False
def run(self):
logging.debug("scanThread: started!")
try:
f = subprocess.Popen('bin/nfc-poll-command', stdin=subprocess.PIPE,
stdout=subprocess.PIPE, universal_newlines=True)
except IOError as e:
logging.debug("scanThread: cannot open poller:".format(e.errno, e.strerror))
while(self.exitthread != True):
line = f.stdout.readline().decode("utf-8").rstrip()
logging.debug(line)
while(line != "WAITING FOR COMMAND"):
line = f.stdout.readline().decode("utf-8").rstrip()
#send scan command and read output
#signal with id
self.setpause()
while(self.pause == True):
time.sleep(1)
pass
f.close()
def setpause(self):
logging.debug("scanThread: setpause")
self.pause = True
def unsetpause(self):
logging.debug("scanThread: unsetpause")
self.pause = False
...
Dann soll das Programm solange die Zeilen von stdout lesen, bis die Zeile "WAITING FOR COMMAND" erscheint, und dann "scan" auf stdin ausgeben und die nächsten 4 Zeilen auslesen. Danach soll wieder auf "WAITING FOR COMMAND" gewartet werden.
Es wäre auch eine Option was am C-Programm zu ändern, wenn jemand eine bessere Lösung hat. Aber es wäre toll wenn sich das über python realisieren lässt.
Das Ganze läuft auf einem Raspberry Pi unter Raspbian/Debian Linux.
Gruß
bitstacker