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

【python】如何优雅的终止while循环的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. python 如何优雅地退出子进程

    python 如何优雅地退出子进程 主进程产生子进程,子进程进入永久循环模式.当主进程要求子进程退出时,如何能安全地退出子进程呢? 参考一些代码,我写了这个例子.运行之后,用kill pid试试.pi ...

  3. break #立即终止本次循环

    #!/user/bin/python# -*- coding:utf-8 -*-# print(111)# while True:# print(222)# print(333)# break #立即 ...

  4. Python编程基础[条件语句if 循环语句 for,while](二)

    ython条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 判断条件: 执行语句……else: 执行语句…… x= ...

  5. python全栈 流程控制;while 循环 格式化输出 运算符 及编码

    python全栈开发 1循环 2break和continue的区别 3格式化输出 4运算符 5编码 一.流程控制while循环 while条件: 代码块(循环体) 1.死循环; while True; ...

  6. python条件判断if···else、循环while和for

    1.if···else条件判断基本语法 if 条件: 执行语句 elif 条件 : 执行语句 …… else : 执行语句 var=input("请输入表示会员级别的数字(1-5):&quo ...

  7. Python中的条件选择和循环语句

    一.条件选择语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: if condition: block elif condition: block ... ...

  8. 一个Python中优雅的数据分块方法

    背景 看到这个标题你可能想一个分块能有什么难度?还值得细说吗,最近确实遇到一个有意思的分块函数,写法比较巧妙优雅,所以写一个分享. 日前在做需求过程中有一个对大量数据分块处理的场景,具体来说就是几十万 ...

  9. python自学笔记10:while循环和for循环

    条件控制和循环控制是两种典型的流程控制方法,前面我们写了 if 条件控制,这节讲 for 循环和 while 循环. 循环是另一种控制流程的方式,一个循环体中的代码在程序中只需要编写一次,但可能会连续 ...

  10. 让Python更优雅更易读(第二集)

    友情链接 让Python更优雅更易读(第一集) 1.装饰器 1.1装饰器特别适合用来实现以下功能 运行时校验:在执行阶段进行特定校验,当校验通不过时终止执行. 适合原因:装饰器可以方便地在函数执行前介 ...

随机推荐

  1. IWeb4j 项目解决web自动化回归测试痛点!

    IWeb4j 项目思想 IWeb项目的测试用例使用数据驱动测试,当下数据驱动使用最多的无非是excel.yaml.json.数据库(后续通过SpringDataJPA实现数据库驱动)作为数据驱动的载体 ...

  2. P6419 COCI2014-2015#1 Kamp

    P6419 COCI2014-2015#1 Kamp 换根 \(dp\) 的 trick. 题面 钦定 \(k\) 个关键点,求每个点出发,访问完所有关键点的距离最小值. 思路 设 \(g_u\) 为 ...

  3. TPC-H、TPC-H、TPC-DS部署测试

    TPC-H.TPC-H.TPC-DS部署测试 概述 TPC-C TPC-C是业界常用的一套Benchmark,用于评估在线事务处理(OLTP)系统性能的基准测试.它模拟了一个商品批发公司的销售模型,包 ...

  4. 使用原生Web开发技术为在线客服系统提供网页版配置工具

    升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放.开源.共享.努力打造 .net 社区的一款优秀开源产品. 背景 随着下载私有化部署的用户越来越多 ...

  5. KnowledgeManagement

    知识管理建议 总则 总参 从无知到有知 资料收集的习惯 发表是最好的记忆 Wiki 使用 建议: Blog 写作 Discuss 搜索技巧 回复:Yibie的知识管理流程与工具选择 一.个人知识管理的 ...

  6. javascript 实现参数重载

    1.概要 在java中,同一个函数签名,比如 getUser,我们可以根据参数的不同,调用不同功能的方法.这也就是参数重载,如何在javascript也实现参数重载呢? 2.实现方法 function ...

  7. ZCMU-1129

    数学公式题罢了 学长 1.斯特灵公式: 2.对数公式(因为以10为底,得到的是10^x,所以最后向下取整加上1): #include<cstdio> #include<cmath&g ...

  8. WxPython跨平台开发框架之用户选择和标签组件的设计

    在系统的权限管理中,往往都会涉及到用户的选择处理,特别是基于角色的访问控制中,很多情况下需要用到选择用户的处理.本篇随笔,基于WxPython跨平台开发框架,采用原有开发框架成熟的一套权限系统理念,对 ...

  9. 从Delphi到Lazarus——Delphi转换器

    0.前言 在Lazarus中使用Delphi编写的文件是一件很简单的事情,这是因为Lazarus可以直接打开Delphi的任何文件,甚至有些文件可以不做任何修改就可以直接使用到你的Lazarus程序中 ...

  10. RocksDB 内存超限问题剖析

    作者:来自 vivo 互联网服务器团队- Zeng Luobin 在使用 RocksDB 存储引擎的过程中,有部分开发者遇到了内存使用超出预期的情况.本文针对这一问题展开了深入分析,从内存使用原理.R ...