实现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实现的百度站长自动URL提交小工具
Jun 27 Python
Python操作列表之List.insert()方法的使用
May 20 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
Python之py2exe打包工具详解
Jun 14 Python
python中reload(module)的用法示例详解
Sep 15 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
python smtplib发送带附件邮件小程序
May 22 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
python快速排序的实现及运行时间比较
Nov 22 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 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中的escape函数
2013/06/29 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
微信小程序url与token设置详解
2017/09/26 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Python星号*与**用法分析
2018/02/02 Python
python re模块的高级用法详解
2018/06/06 Python
Python元组常见操作示例
2019/02/19 Python
python自定义时钟类、定时任务类
2021/02/22 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
用Python实现职工信息管理系统
2020/12/30 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
优秀中专生推荐信
2013/11/17 职场文书
英文版销售经理个人求职信
2013/11/20 职场文书
英文自荐信
2013/12/19 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
老人节主持词
2015/07/04 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
如何拟写通知正文?
2019/04/02 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
Python 循环读取数据内存不足的解决方案
2021/05/25 Python