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 18 Python
详解Python中的正则表达式的用法
Apr 09 Python
django基础之数据库操作方法(详解)
May 24 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
python 简单的调用有道翻译
Nov 25 Python
python math模块的基本使用教程
Jan 16 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
Python制作表白爱心合集
Jan 22 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实现递归的三种基本方式
2020/07/04 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
pycharm 使用心得(三)Hello world!
2014/06/05 Python
python操作sqlite的CRUD实例分析
2015/05/08 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python中Numpy mat的使用详解
2019/05/24 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
《九色鹿》教学反思
2014/02/27 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书