实现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进阶教程之模块(module)介绍
Aug 30 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
python选择排序算法实例总结
Jul 01 Python
python读取oracle函数返回值
Jul 18 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
使用python进行拆分大文件的方法
Dec 10 Python
python日志模块logbook使用方法
Sep 19 Python
python:动态路由的Flask程序代码
Nov 22 Python
python在地图上画比例的实例详解
Nov 13 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python通过cython加密代码
Dec 11 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
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
数字转英文
2006/12/06 PHP
php数组键值用法实例分析
2015/02/27 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
用Python实现一个简单的线程池
2015/04/07 Python
使用python实现生成用户信息
2017/03/20 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
房地产销售经理岗位职责
2014/01/01 职场文书
保险公司早会主持词
2014/03/22 职场文书
护士个人自我鉴定
2014/03/24 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
离职感谢信
2015/01/21 职场文书
人民检察院起诉书
2015/05/20 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android