uziel Geschrieben September 5, 2013 at 08:19 Geschrieben September 5, 2013 at 08:19 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. Zitieren
AuronX Geschrieben September 5, 2013 at 09:46 Geschrieben September 5, 2013 at 09:46 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. Zitieren
jan Geschrieben September 5, 2013 at 12:30 Geschrieben September 5, 2013 at 12:30 Python kann auch (parallele) Threads. Vielleicht wäre das eine andere Lösung. Zitieren
uziel Geschrieben September 5, 2013 at 16:47 Autor Geschrieben September 5, 2013 at 16:47 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 Zitieren
borg Geschrieben September 5, 2013 at 17:13 Geschrieben September 5, 2013 at 17:13 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() Zitieren
uziel Geschrieben September 5, 2013 at 18:55 Autor Geschrieben September 5, 2013 at 18:55 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. Zitieren
AuronX Geschrieben September 5, 2013 at 20:43 Geschrieben September 5, 2013 at 20:43 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. Zitieren
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.