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之开始真正编程
Sep 12 Python
Python中的作用域规则详解
Jan 30 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
python微信公众号之关键词自动回复
Jun 15 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python datetime模块使用方法小结
Jun 18 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 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引用返回与取消引用的详解
2013/06/08 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
php实现短信发送代码
2015/07/05 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
php新建文件的方法实例
2019/09/26 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
DOM 中的事件处理介绍
2012/01/18 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
简单解析Django框架中的表单验证
2015/07/17 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
python实现微信防撤回神器
2019/04/29 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
500行python代码实现飞机大战
2020/04/24 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
惠普香港官方商店:HP香港
2019/04/30 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
高二英语教学反思
2014/01/19 职场文书
营销计划书范文
2015/01/17 职场文书
实习推荐信格式模板
2015/03/27 职场文书
民事申诉状范本
2015/05/20 职场文书