退出 Python While True 循环
Exiting Python While True loop
我在 raspberry pi 上使用温度传感器 (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")
我以为我设置了故障保险,但它仍然不起作用。
这是我的代码片段。
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,是的问题...
我可以在保存时打印("Do not close the program"),但我想做这个白痴证明。
有什么建议吗?谢谢!
您可以注册一个信号处理程序,并在处理结束时退出循环。
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
。
我在 raspberry pi 上使用温度传感器 (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")
我以为我设置了故障保险,但它仍然不起作用。
这是我的代码片段。
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,是的问题...
我可以在保存时打印("Do not close the program"),但我想做这个白痴证明。
有什么建议吗?谢谢!
您可以注册一个信号处理程序,并在处理结束时退出循环。
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
。