实现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中使用item()方法遍历字典的例子
Aug 26 Python
python模块之StringIO使用示例
Apr 08 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
实用自动化运维Python脚本分享
Jun 04 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
Python安装使用Scrapy框架
Apr 12 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
Python可以实现栈的结构吗
2020/05/27 Python
Python中Yield的基本用法
2020/10/18 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
Java如何读取CLOB字段
2013/10/10 面试题
信息服务专业毕业生求职信
2014/03/02 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
汽车销售员工作总结
2015/08/12 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS