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 相关文章推荐
windows下python安装paramiko模块和pycrypto模块(简单三步)
Jul 06 Python
安装Python的教程-Windows
Jul 22 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
python读取文件名称生成list的方法
Apr 27 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
Python timer定时器两种常用方法解析
Jan 20 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
Django 实现图片上传和下载功能
Dec 31 Python
Python移位密码、仿射变换解密实例代码
Jun 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表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
PHP制作万年历
2015/01/07 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
慎用 somefunction.prototype 分析
2009/06/02 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
Python中存取文件的4种不同操作
2018/07/02 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
房地产出纳岗位职责
2013/12/01 职场文书
材料员岗位职责
2014/03/13 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
四年级语文教学反思
2016/03/03 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers