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. 基于surging 的木舟平台如何通过Tcp或者UDP网络组件接入设备

    一.概述 上篇文章介绍了木舟通过HTTP网络组件接入设备,那么此篇文章将介绍如何利用Tcp或者UDP网络组件接入设备. 木舟 (Kayak) 是什么? 木舟(Kayak)是基于.NET6.0软件环境下 ...

  2. 题解:CF559B Equivalent Strings

    CF559B Equivalent Strings 题解 题目描述 吐槽一下,题目翻译有歧义. 思路分析 你会发现,当你需要判断字符串 \(a,b\) 是否等价时,如果长度为偶数,需要继续判断字符串 ...

  3. Python爬虫之数据解析

    1.Request库 HTTP测试工具:http://httpbin.org,以下的示例会以此为URL 属于第三方库,需要手动安装 pip install requests 基本用法 import r ...

  4. HttpWebRequest调用API

    public void HttpWebRequestPost(){ string responseContent = string.Empty; var userNameAndPwd = new { ...

  5. Firefox无需第三方插件在关闭最后一个标签后也不退出程序

    about:config 输入lasttab 变成false

  6. SqlLite查看工具

    有时候想查看下sqllite,又不需要功能齐全的客户端,SQLiteSpy是个临时应急的好工具(也许本身功能就很强,没仔细研究). https://files.cnblogs.com/files/ja ...

  7. php 异步并行后续--兼容FPM使用的组件

    上次给人推荐了这篇文章,关于PHP异步并行的文章,之后有人评论问这个组件能不能给fpm用,我测试了一下发现不行,于是又找到一个可以给fpm用的http请求组件. 安装很简单,就这样  composer ...

  8. php 如何创建uuid

    传统的创建uuid的方法是自己写个函数实现随机 <?php function create_uuid($prefix="") { $chars = md5(uniqid(mt ...

  9. python 爬虫基本玩法,统计杭电oj题目正确率并排序

    python爬虫主要用两个库:Urllib和BeautifulSoup4.一个用来爬取网页,一个用来解析网页. Urllib是Python内置的HTTP请求库,它包含四个模块: 1.request,最 ...

  10. Python通过requests模块处理form-data请求格式

    1.安装 requests_toolbelt 模块,引入该模块下的 MultipartEncoder 2.在 请求体 中使用该模块函数,请求头中增加对应参数值 from requests_toolbe ...