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装饰器验证配置文件示例
Feb 24 Python
python 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
详解Python中的正则表达式的用法
Apr 09 Python
python django 访问静态文件出现404或500错误
Jan 20 Python
python爬取网页转换为PDF文件
Jun 07 Python
Python查找文件中包含中文的行方法
Dec 19 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
python和php哪个容易学
Jun 19 Python
Python 如何测试文件是否存在
Jul 31 Python
python 动态绘制爱心的示例
Sep 27 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中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
微信小程序实现吸顶特效
2020/01/08 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
python二叉树的实现实例
2013/11/21 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
python生成二维码的实例详解
2017/10/29 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
社区学习十八大感想
2014/01/22 职场文书
消防应急演练方案
2014/02/12 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
实习单位鉴定意见
2015/06/04 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers