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程序中的观察者模式结构编写示例
May 27 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 Python
Python 字符串换行的多种方式
Sep 06 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python登录系统界面实现详解
Jun 25 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
python中删除某个元素的方法解析
Nov 05 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
Python数据正态性检验实现过程
Apr 18 Python
解析目标检测之IoU
Jun 26 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
php中定义网站根目录的常用方法
2010/08/08 PHP
php中error与exception的区别及应用
2014/07/28 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
JavaScript Split()方法
2015/12/18 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
在Python中marshal对象序列化的相关知识
2015/07/01 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python 异常处理的实例详解
2017/09/11 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python验证码图片处理(二值化)
2019/11/01 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
python 装饰器重要在哪
2021/02/14 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
几个SQL的面试题
2014/03/08 面试题
介绍一下代理模式(Proxy)
2014/10/17 面试题
党校培训思想汇报
2014/01/03 职场文书
保险公司晨会主持词
2014/03/22 职场文书
调研汇报材料范文
2014/08/17 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
2015初中团委工作总结
2015/07/28 职场文书