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 相关文章推荐
django中的setting最佳配置小结
Nov 21 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
一个Python最简单的接口自动化框架
Jan 02 Python
对python 自定义协议的方法详解
Feb 13 Python
详解python多线程之间的同步(一)
Apr 03 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Python log模块logging记录打印用法解析
Jan 20 Python
python数据类型可变不可变知识点总结
Mar 06 Python
Python学习之os模块及用法
Jun 03 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
Python中Permission denied的解决方案
Apr 02 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP 八种基本的数据类型小结
2011/06/01 PHP
PHP简洁函数小结
2011/08/12 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
js Function类型
2011/12/04 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
python的else子句使用指南
2016/02/27 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Django组件content-type使用方法详解
2019/07/19 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
.net软件工程师面试题
2015/03/31 面试题
中层干部竞聘演讲稿
2014/05/15 职场文书
中队活动总结
2014/08/27 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
埃及王子观后感
2015/06/16 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL