uziel Posted September 5, 2013 at 08:19 AM Posted September 5, 2013 at 08:19 AM Liebe TinkerForge-Community, seit einiger Zeit bastel ich an einem kleinen Projekt, in welchem ich sekündlich Messwerte der Tinker-Bricklets in einer .csv-Datei zeilenweise speichern möchte. Dazu muss ich sagen, dass ich mit Python das erste Mal versuche (außerhalb von Grundkursen in Schule und Uni...die lange her sind) wieder zu programmieren. Zuerst habe ich dies über eine einfache Schleife gelöst, welche die Werte sekündlich abfragt und speichert. Was mir daran nicht gefiel ist, dass das Programm dadurch eigentlich den Hauptteil wartet und alles nacheinander abgearbeitet wird. Sollten später komplexere Teilschritte dazu kommen, würde es sowieso meine "Zeitplanung" durcheinander werfen. Deswegen möchte ich nun das Abspeichern von Messwerten mit Callbacks lösen, und so quasi gleichzeitig mehrere andere Aufgaben des Programms ausführen zu können. Anfangs definiere ich den Callback: def cb_illuminance_data(illuminance): ausgabe1.writerow([str(illuminance/10)]) später im Hauptteil möchte ich Ihn folgendermaßen ausführen: ambl.set_illuminance_callback_period(100) with open('gerty_illuminance_data.csv', 'wb') as csvfile1: ausgabe1 = csv.writer(csvfile1, delimiter=';', quotechar='|') ausgabe1.writerow(['Beleuchtungsstärke']) ausgabe1.writerow(['lux']) ambl.register_callback(ambl.CALLBACK_ILLUMINANCE, cb_illuminance_data) Leider bricht beim Ausführen das Programm mit dem ersten Anlauf des Callbacks mit einer Fehlermeldung ab ("Callback loop"). Welchem (Denk)Fehler bin ich unterlegen? PS: den genauen Fehlerbericht liefere ich heute Abend nach. Ich bin derzeit nicht zu Hause, mich juckt das Problem aber schon so lange, dass ich nicht länger warten konnte es zu schildern. Vielen Dank. Quote
AuronX Posted September 5, 2013 at 09:46 AM Posted September 5, 2013 at 09:46 AM Ich bin nicht ganz so fit in Python und könnte mich täuschen, aber ich glaube am Ende des with-Blocks wird csvfile1 geschlossen. Wenn dem so wäre, dann könnten die Callbacks die ja erst nach diesem with-Block eintrudeln gar nichts mehr schreiben, weil die datei ja bereits geschlossen ist. Das with open('gerty_illuminance_data.csv', 'wb') as csvfile1: sollte also durch ein simples csvfile1 = open('gerty_illuminance_data.csv', 'wb') ersetzt werden... natürlich muss diese Datei dann auch bei Programmende selbst geschlossen werden. Quote
jan Posted September 5, 2013 at 12:30 PM Posted September 5, 2013 at 12:30 PM Python kann auch (parallele) Threads. Vielleicht wäre das eine andere Lösung. Quote
uziel Posted September 5, 2013 at 04:47 PM Author Posted September 5, 2013 at 04:47 PM Erst einmal vielen Dank für die Anregungen. und jetzt der komplette error log: Exception in thread Callback-Processor: Traceback (most recent call last): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 552, in __bootstrap_inner File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 505, in run File "build/bdist.linux-x86_64/egg/tinkerforge/ip_connection.py", line 743, in callback_loop self.dispatch_packet(data) File "build/bdist.linux-x86_64/egg/tinkerforge/ip_connection.py", line 724, in dispatch_packet cb(self.deserialize_data(payload, form)) File "/Users/Martin/Documents/Projekte/TinkerForge/Gerty/gerty_130830.py", line 48, in cb_illuminance_data ausgabe1.writerow([str(illuminance/10)]) ValueError: I/O operation on closed file Quote
borg Posted September 5, 2013 at 05:13 PM Posted September 5, 2013 at 05:13 PM AuronX hat recht sobald der Block des with-Statement zuende ist wird die Datei geschlossen. Also einfach csvfile1 = open('gerty_illuminance_data.csv', 'wb') ausgabe1 = csv.writer(csvfile1, delimiter=';', quotechar='|') ausgabe1.writerow(['Beleuchtungsstärke']) ausgabe1.writerow(['lux']) ambl.register_callback(ambl.CALLBACK_ILLUMINANCE, cb_illuminance_data) und dann wenn du nichts mehr schreiben willst csvfile1.close() Quote
uziel Posted September 5, 2013 at 06:55 PM Author Posted September 5, 2013 at 06:55 PM argh, das war einfach. vielen dank. hab noch eine weitere möglichkeit gefunden: def cb_illuminance_data(illuminance): fambl = open('gerty_illuminance_data.csv', 'a') fambl.write(str(illuminance/10)) fambl.write('\n') fambl.close() und unten dann nur noch: ambl.register_callback(ambl.CALLBACK_ILLUMINANCE, cb_illuminance_data) ich war zu versteift auf die "with open" lösung. mal sehen welche der beiden von vorteil sein wird. Quote
AuronX Posted September 5, 2013 at 08:43 PM Posted September 5, 2013 at 08:43 PM Bei deiner Alternative kannst du dann natürlich auch wieder with nutzen, weil du außerhalb keinen Zugriff auf die datei durchführst. Also wenn du öffnen und schließen beides im cb hast. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.