实现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的Twisted框架中reactor事件管理器的用法
May 25 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
python内置数据类型之列表操作
Nov 12 Python
Python版名片管理系统
Nov 30 Python
基于树莓派的语音对话机器人
Jun 17 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
Python实现密码薄文件读写操作
Dec 16 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
关于python的缩进规则的知识点详解
Jun 22 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
python APScheduler执行定时任务介绍
Apr 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中mysql_field_type()函数用法
2014/11/24 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
介绍Python的@property装饰器的用法
2015/04/28 Python
Unicode和Python的中文处理
2017/03/19 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
利用python绘制正态分布曲线
2021/01/04 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
护士自我鉴定范文
2013/10/06 职场文书
运动会广播稿200米
2014/01/27 职场文书
公司合作协议书范本
2014/04/18 职场文书
大学三年计划书范文
2014/04/30 职场文书
学校安全管理责任书
2014/07/23 职场文书
龙门石窟导游词
2015/02/02 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
JavaScript ES6的函数拓展
2022/01/18 Javascript
带你了解Java中的ForkJoin
2022/04/28 Java/Android