实现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 re正则表达式模块(Regular Expression)
Jul 16 Python
virtualenv实现多个版本Python共存
Aug 21 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
详解python3中zipfile模块用法
Jun 18 Python
简单了解django索引的相关知识
Jul 17 Python
python求平均数、方差、中位数的例子
Aug 22 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
对python中return与yield的区别详解
Mar 12 Python
python中rb含义理解
Jun 18 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
深入理解Python变量的数据类型和存储
Feb 01 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下过滤HTML代码的函数
2007/12/10 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
企业安全生产责任书范本
2014/07/28 职场文书
就业意向书
2014/07/29 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
实习单位指导教师评语
2014/12/30 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python
python缺失值填充方法示例代码
2022/12/24 Python
React更新渲染原理深入分析
2022/12/24 Javascript