Jump to content

[Python] mit Callback in eine Datei schreiben


Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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()

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...