Linux 下 Python 实现按任意键退出的实现方法


Posted in Python onSeptember 25, 2016

某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要还是Linux下的。

当然,Windows系统下会稍微简单一些,Windows系统下如果你安装了python的环境,默认自带的一个模块叫做msvcrt,import msvcrt,然后调用msvcrt.getch()即可。接下来即Linux下实现python版本的按任意键退出。

初学Python时在总想实现一个按任意键继续/退出的程序(受.bat毒害), 奈何一直写不出来, 最近学习Unix C时发现可以通过 termios.h 库来实现, 尝试一下发现Python也有这个库, 所以终于写出一个这样的程序. 下面是代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import termios
def press_any_key_exit(msg):
# 获取标准输入的描述符
fd = sys.stdin.fileno()
# 获取标准输入(终端)的设置
old_ttyinfo = termios.tcgetattr(fd)
# 配置终端
new_ttyinfo = old_ttyinfo[:]
# 使用非规范模式(索引3是c_lflag 也就是本地模式)
new_ttyinfo[3] &= ~termios.ICANON
# 关闭回显(输入不会被显示)
new_ttyinfo[3] &= ~termios.ECHO
# 输出信息
sys.stdout.write(msg)
sys.stdout.flush()
# 使设置生效
termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
# 从终端读取
os.read(fd, 7)
# 还原终端设置
termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)
if __name__ == "__main__":
press_any_key_exit("按任意键继续...")
press_any_key_exit("按任意键退出...")

其他关于 termios 的信息可以参考Linux手册:

man 3 termios

另补充一下*nix终端的三种模式(摘自<Unix-Linux编程实践教程>)

规范模式

规范模式, 也被成为cooked模式, 是用户常见的模式.驱动程序输入的字符保存在缓冲区, 并且仅在接收到回车键时才将这些缓冲的字符发送到程序.缓冲数据使驱动程序可以实现最基本的编辑功能, 被指派这些功能的特定键在驱动程序里设置, 可以通过命令stty或系统调用tcsetattr来修改

非规范模式

当缓冲和编辑功能被关闭时, 连接被成为非规范模式.终端处理器仍旧进行特定的字符处理, 例如处理Ctrl-C及换行符之间的转换, 但是编辑键将没有意义, 因此相应的输入被视为常规的数据输入 程序需要自己实现编辑功能

raw模式

当所有处理都被关闭后, 驱动程序将输入直接传递给程序, 连接被成为raw模式.

以上所述是小编给大家介绍的Linux 下 Python 实现按任意键退出的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python 测试实现方法
Dec 24 Python
从零学Python之hello world
May 21 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python实现合并字典的方法
Jul 07 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
django如何自己创建一个中间件
Jul 24 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
利用Python为iOS10生成图标和截屏
Sep 24 #Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 #Python
Python 爬虫模拟登陆知乎
Sep 23 #Python
python 自动化将markdown文件转成html文件的方法
Sep 23 #Python
Python增量循环删除MySQL表数据的方法
Sep 23 #Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 #Python
Python 制作糗事百科爬虫实例
Sep 22 #Python
You might like
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
js 函数的副作用分析
2011/08/23 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python学习基础之循环import及import过程
2018/04/22 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
光声世纪笔试题目
2012/08/25 面试题
爱岗敬业演讲稿范文
2014/01/14 职场文书
校园十大歌手策划书
2014/02/01 职场文书
创先争优活动方案
2014/02/12 职场文书
推荐信格式范文
2014/05/09 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB