2017-08-09 7 views
1

ラズベリーパイに温度センサー(HS18B20)を使用しています。 1秒ごとに温度がスプレッドシートに記録され、whileループを使用してdropboxに送信されます。 ctrl + cが押されるまで、これは永久に実行されます。 Dropboxにアップロードするには、別のファイルと同じファイル名を使用することはできません。プログラムはエラーを出して停止します。明らかに、私は単に毎回違う名前のファイルを作成することはできますが、Dropboxで何百もの異なるファイルを扱うためには、Dropboxのファイルを削除してすぐに新しいスプレッドシートをDropboxにアップロードします。 1つのことを除いてこの技術に問題はありません...Python終了時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() 

それは温度の読みを取っている間、私はプログラムC + CTRL場合は、問題ありません!プログラムはc%6 == 0になるまでループを終了してから、保存して終了します。

私は+プログラムCその節約しながら、はい...

をCTRL場合はその貯蓄私は(「プログラムを閉じないでください」)印刷できませんでしたが、私はこの馬鹿を証明したいと思います。

ヒント?ありがとう!

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

True場合は、適切な時間にあなたのループでuserQuitRequestedの確認、およびbreakことができます。

+0

あなたのアドバイスとGregのアドバイスの両方を使用して終了しました。 この割り込みコードを使用すると、プログラムをきれいに見せるのに便利なすべてのトレースバックメッセージが削除されます。 私のプログラムをはるかに高速化した保存を上書きするには、ドロップボックスコードの場合: dbx.files_upload(f.read()、 '/ file'、mode = dropbox.files.WriteMode.overwrite) –