实现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中itertools模块用法详解
Sep 25 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
简单介绍Python下自己编写web框架的一些要点
Apr 29 Python
python实现连接mongodb的方法
May 08 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
python实现连连看游戏
Feb 14 Python
Python爬虫requests库多种用法实例
May 28 Python
python获取带有返回值的多线程
May 02 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删除数组中重复元素的方法
2015/12/22 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
优雅地使用loading(推荐)
2019/04/20 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
Python生成pdf文件的方法
2014/08/04 Python
Python兔子毒药问题实例分析
2015/03/05 Python
MySQL最常见的操作语句小结
2015/05/07 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python使用python-docx读写word文档
2019/08/26 Python
Django实现文件上传下载功能
2019/10/06 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
爷爷追悼会答谢词
2014/01/24 职场文书
乡下人家教学反思
2014/02/01 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
高一作文之暖冬
2019/11/09 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
怎么用Python识别手势数字
2021/06/07 Python