首页 > 编程语言 >【python】如何优雅的终止while循环

【python】如何优雅的终止while循环

时间:2024-04-16 22:47:24浏览次数:18  
标签:shell python KeyboardInterrupt 优雅 while adb exit True

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

相关文章

  • python3字符串格式化用format()好还是 % 表达式好
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取python编程资料在Python中,使用format()方法是更推荐的方式来进行字符串格式化,特别是在Python3中。虽然%表达式仍然可以在Python中使用,但已经不推荐使用了,新的项目中能不用就不用,谁知道哪......
  • python 有什么资格称为编程排行榜第一
    python有什么资格称为编程排行榜第一?你确定没开玩笑吗?python的开发者以及使用者从来就没有说过python为编程排行榜第一,语言永远都只是一个工具,杀鸡用菜刀,砍树用斧头,那你能说斧头一定比菜到好使吗?编程排行榜是基于某些指标进行评估的,不同的指标可能会导致不同的排名结果。所以讨......
  • 为什么python的数据库语句要用参数化构造的方式
    以下是一个python的数据库插入语句self.cur.execute('''INSERTINTObooks(url,title,product_type,price_excl_tax,price_incl_tax,availability,num_reviews,rating,category,describe)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)&......
  • Effective Python:第3条 了解bytes与str的区别
    Python有两种类型可以表示字符序列:一种是bytes,另一种是str。bytes实例包含的是原始数据,即8位的无符号值(通常按照ASCII编码标准来显示)。str实例包含的是Unicode码点(codepoint,也叫作代码点)。注意点:1,bytes和str并不兼容。在传递字符序列的时候需要注意。a=b"h\x65llo"b="wo......
  • range函数python用法
    range函数python用法概述range()是python的一个内置函数,用来创建一个整数序列,常用于for循环中。理解range()的运用会对我们使用循环很有帮助。语法range函数语法格式如下:-start:序列的起始数值,默认从0开始-stop:序列结束的数值(不包含在序列中)-step:步长,默认为1参数说明......
  • python-函数参数的学习
    '''函数的参数实际上是实际参数传给形式参数的过程通用性更强,可以理解为一个模版'''#defadd(a,b):#a,b是形参#print(a+b)#add(2,3)#传递参数'''1.必选参数,定义了几个,就必须传几个'''#deffunb(a,b):#result=a-b#print(result)#funb......
  • Python 入门指南(四)
    原文:zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92译者:飞龙协议:CCBY-NC-SA4.0第十章:哈希和符号表我们之前看过列表,其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效。它们是整数,因此它们快速且易于操作。但是,它们并不总是对我们很有效。例如,......
  • Python 入门指南(五)
    原文:zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92译者:飞龙协议:CCBY-NC-SA4.0第十六章:Python中的对象因此,我们现在手头上有一个设计,并且准备将该设计转化为一个可工作的程序!当然,通常情况下不会这样。我们将在整本书中看到好的软件设计示例和提示,但我们的重......
  • Python 入门指南(六)
    原文:zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92译者:飞龙协议:CCBY-NC-SA4.0第十九章:何时使用面向对象编程在之前的章节中,我们已经涵盖了面向对象编程的许多定义特性。我们现在知道面向对象设计的原则和范例,并且我们已经涵盖了Python中面向对象编程的语......
  • Python 入门指南(七)
    原文:zh.annas-archive.org/md5/97bc15629f1b51a0671040c56db61b92译者:飞龙协议:CCBY-NC-SA4.0第二十二章:Python设计模式I在上一章中,我们简要介绍了设计模式,并介绍了迭代器模式,这是一个非常有用和常见的模式,以至于它已经被抽象成了编程语言本身的核心。在本章中,我们将回顾......