2017-08-09 60 views
1

我在我的覆盆子pi上使用溫度傳感器(HS18B20)。每隔大約一秒鐘,溫度被記錄到電子表格上,並使用一段時間的True循環發送到Dropbox。它會一直這樣做,直到ctrl + c被按下。爲了上傳到保管箱,我不能擁有與其他文件相同的文件名。該程序會給出錯誤並停止。顯然,我可以簡單地創建一個名稱不同的文件,但要在Dropbox上打擊數百個不同的文件,我會刪除Dropbox上的文件並立即將新電子表格上傳到Dropbox。我對這種技術沒有任何問題,除了一件事...正在退出Python While True

如果通過ctrl + c在文件被刪除後立即停止該程序,並且在上傳文件的過程中,新文件不會上傳並且只能在保管箱中刪除(本地.xls文件永遠不會被刪除;只需替換)。

toc = time.strftime("%b %-d, %Y. %H:%M:%S") 
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") 

我以爲我設置了故障保險功能,但它仍然無效。

這是我的代碼片段。

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

如果我CTRL + C程序,而它的採取的溫度讀數,沒問題!該程序完成其循環,直到c%6 == 0,然後保存並關閉。

如果我CTRL + C程序,而其節能,是問題......

我可以只打印(「不要關閉程序」)時,其省電,但我想使這個白癡證明。

任何提示?謝謝!

+1

或者,您可以傳遞['WriteMode.overwrite'](https://dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.files.WriteMode.overwrite)或[' WriteMode.update'](https://dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.files.WriteMode.update)至['files_upload']的'mode'參數(HTTPS ://dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.dropbox.Dropbox.files_upload)完全避免這種可能性。 (也就是說,讓您不必刪除現有的文件,開始使用。) – Greg

回答

0

您可以在處理結束時註冊信號處理程序並退出循環。

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

你可以在你的循環在適當的時候再檢查userQuitRequested,並且break如果True

+0

我結束了同時使用你的建議和格雷格的建議。 使用這個中斷代碼可以消除所有的回溯消息,這對於使程序看起來整潔很方便。 因爲我使用Dropbox的代碼: dbx.files_upload(f.read()「/文件」,模式= dropbox.files.WriteMode.overwrite)覆蓋我保存它更快做我的計劃! –