实现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解析excel文件存入sqlite数据库的方法
Nov 15 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
python 批量修改 labelImg 生成的xml文件的方法
Sep 09 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
Dec 10 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
python 如何上传包到pypi
Dec 24 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
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python判断中文字符串是否相等的实例
2018/07/06 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
Python实现多属性排序的方法
2018/12/05 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
信息管理员岗位职责
2013/12/01 职场文书
乐观大学生的自我评价
2014/01/10 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
物业管理专业求职信
2014/06/11 职场文书
重点工程汇报材料
2014/08/27 职场文书
会计求职自荐信范文
2015/03/04 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android