实现python版本的按任意键继续/退出


Posted in Python onSeptember 26, 2016

某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要还是Linux下的。

要实现该功能,需要的就是暂停程序、等待并捕捉用户的一个键盘输入,然后继续执行。Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux。

当然,Windows系统下会稍微简单一些,Windows系统下如果你安装了python的环境,默认自带的一个模块叫做msvcrt,import msvcrt,然后调用msvcrt.getch()即可。

1、按回车键退出。

#coding=utf-8
raw_input(unicode('按回车键退出...','utf-8').encode('gbk'))

2、按任意键继续。

import os
os.system('pause')

接下来即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模式.

Python 相关文章推荐
Python中is与==判断的区别
Mar 28 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
Python内置函数delattr的具体用法
Nov 23 Python
Pandas分组与排序的实现
Jul 23 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
python获取array中指定元素的示例
Nov 26 Python
django框架中间件原理与用法详解
Dec 10 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
详解Python自动化之文件自动化处理
Jun 21 Python
Python requests用法和django后台处理详解
Mar 19 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 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
You might like
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
php递归创建目录的方法
2015/02/02 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
python中pdb模块实例用法
2021/01/15 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
公司企业表扬信
2014/01/11 职场文书
写给学生的新学期寄语
2014/01/18 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
大二学习计划书范文
2014/04/27 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
工作失职检讨书500字
2014/10/17 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书