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的Bottle框架中使用微信API的示例
Apr 23 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
在Python的Django框架中创建语言文件
Jul 27 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
PyTorch学习笔记之回归实战
May 28 Python
详解python3中tkinter知识点
Jun 21 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 Python
如何用python实现一个HTTP连接池
Jan 14 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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二分法在IP地址查询中的应用
2008/08/12 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
koa-router源码学习小结
2018/09/07 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
Python转码问题的解决方法
2008/10/07 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
python实现单向链表详解
2018/02/08 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
Python logging设置和logger解析
2019/08/28 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
个人贷款承诺书
2014/03/28 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
教师考核表个人总结
2015/02/12 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript