1. 背景需求
python需要与外界或终端交互时,常常需要使用while循环一直跑。
如果需要终止程序,一般使用Ctrl+c,此时终端会打印一大堆backtrace,并且无法保留当前运行的状态,非常不优雅。
使用KeyboardInterrupt异常捕捉,可以实现优雅的终止while循环。
2. 实现方法
try:
while(True):
xxx
except KeyboardInterrupt:
print("KeyboardInterrupt, exit...")
exit()
3. 偶现Ctrl+c无法终止程序
经过定位发现在执行下列语句时,不会收到Ctrl+c的中断信号:
os.popen("adb shell getprop ro.product.device").read()
如果while循环写成了:
try:
while(True):
os.popen("adb shell getprop ro.product.device").read()
except KeyboardInterrupt:
print("KeyboardInterrupt, exit...")
exit()
则while循环的大部分时间都无法响应Ctrl+c信号,无法被终止。
解决方案:
使用op.popen("adb shell xxx")是为了判断adb是否连接。经过测试发现使用subprocess.run()同样可以判断设备是否连接,且不会关闭KeyboardInterrupt中断:
import subprocess
result = subprocess.run(['adb', 'shell', 'ls'], capture_output=True, text=True)
# 如果收到结果则返回0
if result.returncode == 0:
print("adb is connected")
# 如果没有收到结果,则返回1
else:
print("adb is not connected")
# 不要使用adb devices替代adb shell ls,因为adb devices在adb没有连接的时候也会返回有效结果:
# List of devices attached
标签:shell,python,KeyboardInterrupt,优雅,while,adb,exit,True From: https://www.cnblogs.com/moon-sun-blog/p/18139442