2017-08-09 8 views
1

Ich verwende einen Temperatursensor (HS18B20) auf meinem Raspberry Pi. Jede Sekunde wird die Temperatur in einer Tabellenkalkulation aufgezeichnet und mit einer True-Schleife an Dropbox gesendet. Es wird dies für immer tun, bis Strg + C gedrückt wird. Um in Dropbox hochladen zu können, kann ich nicht den gleichen Dateinamen wie eine andere Datei haben. Das Programm gibt einen Fehler und stoppt. Natürlich könnte ich einfach immer eine Datei mit einem anderen Namen erstellen, aber um zu verhindern, dass hunderte von verschiedenen Dateien in der Dropbox gespeichert werden, lösche ich die Datei in der Dropbox und lade die neue Tabelle sofort in die Dropbox hoch. Ich habe kein Problem mit dieser Technik, bis auf eine Sache ...Python während True loop

Wenn das Programm direkt nach dem Löschen der Datei über ctrl + c gestoppt wird und während des Hochladens der Datei, wird die neue Datei nicht hochgeladen und wird nur in der Dropbox gelöscht (die lokale .xls Datei wird niemals gelöscht, sondern nur ersetzt).

Ich dachte, ich habe ein Fail-Safe eingerichtet, aber es funktioniert immer noch nicht.

Hier ist ein Ausschnitt aus meinem Code.

def signal_handler(signal, frame): 
    signal interrupted 
    interrupted = True 
signal.signal(signal.SIGINT, signal_handler) 
interrupted = False 

...

while True: 
     print("Temperature Taken") 
       a += 1 
       c += 1 
       if temp_f < input_bad: 
         ws.write(a,0,temp_f) 
         ws.write(a,1,time.strftime("%H:%M:%S %p")) 
         ws.write(a,2,"YES") 

       while c % 6 == 0:         
         c += 1           
         dbx.files_delete('/Temperature Data ' + toc + '.xls') 
         with open(time.strftime("%m_%d_%Y") + '.xls', "rb") as f: 
           dbx.files_upload(f.read(), '/Temperature Data ' + toc + '.xls') 
         print("Uploaded to Dropbox") 
         if interrupted: 
           print("Saving...") 
           dbx.files_delete('/Temperature Data ' + toc + '.xls') 
           with open(time.strftime("%m_%d_%Y") + '.xls',"rb") as f: 
             dbx.files_upload(f.read(), '/Temperature Data ' + toc + '.xls') 
           quit() 

Wenn ich Strg + C das Programm, während es eine Temperaturablesungen, kein Problem! Das Programm beendet seine Schleife bis c% 6 == 0 und speichert und schließt dann.

Wenn ich + c das Programm während seiner Spar ctrl, ja Problem ...

ich gerade („schließen Sie das Programm nicht“) drucken konnte seine Einsparung bei, aber ich möchte diese idiotensicher machen .

Irgendwelche Tipps? Vielen Dank!

+1

Alternativ können Sie ein ['WriteMode.overwrite'] (https://dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.files.WriteMode.overwrite) oder ['übergeben WriteMode.update'] (https://dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.files.WriteMode.update) zum 'mode' Parameter von [' files_upload'] (https : //dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.dropbox.Dropbox.files_upload), um diese Möglichkeit vollständig zu vermeiden. (Das heißt, damit Sie die vorhandene Datei nicht zu Beginn löschen müssen.) – Greg

Antwort

0

Sie können eine Signalbehandlungsroutine registrieren und die die Schleife beendet wird, wenn am Ende der Verarbeitung.

import signal 
import sys 

userQuitRequested = False 

def signal_handler(signal, frame): 
     print('You pressed Ctrl+C!') 
     userQuitRequested = True 
signal.signal(signal.SIGINT, signal_handler) 
print('Press Ctrl+C to quit') 

können Sie dann zu gegebener Zeit für userQuitRequested in der Schleife überprüfen, und break wenn True.

+0

Ich endete damit, dass Sie sowohl Ihren Rat als auch Gregs Ratschlag verwendeten. Mit diesem Interrupt-Code werden alle Traceback-Nachrichten gelöscht, was praktisch ist, um das Programm ordentlich aussehen zu lassen. Für den Dropbox-Code I verwendet: dbx.files_upload (f.read(), '/ file', mode = dropbox.files.WriteMode.overwrite) zu überschreiben meine speichern die mein Programm viel schneller gemacht! –