【问题标题】:Exiting Python While True loop退出 Python While True 循环
【发布时间】:2017-08-10 04:31:49
【问题描述】:

我在我的树莓派上使用温度传感器 (HS18B20)。每隔一秒左右,温度就会记录到电子表格中,并使用 while True 循环发送到保管箱。它将永远这样做,直到按下 ctrl + c。为了上传到保管箱,我不能使用与另一个文件相同的文件名。该程序将给出错误并停止。显然,我每次都可以简单地创建一个具有不同名称的文件,但为了避免在 Dropbox 上有数百个不同的文件,我删除了 Dropbox 上的文件并立即将新的电子表格上传到 Dropbox。我对这种技术没有任何问题,除了一件事......

如果在文件被删除后和文件上传过程中通过 ctrl + c 停止程序,则新文件不会被上传,只会在 dropbox 上被删除(本地 .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")

我以为我设置了故障保险,但它仍然不起作用。

这是我的代码中的一个 sn-p。

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 ,是的问题...

我可以在保存时打印(“不要关闭程序”),但我想证明这个白痴。

有什么建议吗?谢谢!

【问题讨论】:

标签: python-3.x dropbox-api


【解决方案1】:

您可以注册一个信号处理程序并在处理结束时退出循环。

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,如果True 则检查break。

【讨论】:

  • 我最终同时使用了您的建议和 Greg 的建议。使用此中断代码消除了所有便于使程序看起来整洁的回溯消息。对于我使用的保管箱代码:dbx.files_upload(f.read(), '/file', mode=dropbox.files.WriteMode.overwrite) 覆盖我的保存,这使我的程序更快!
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多