实现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操作Word批量生成文章的方法
Jul 28 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
实例详解Python模块decimal
Jun 26 Python
基于python3的socket聊天编程
Feb 17 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
分享提高 Python 代码的可读性的技巧
Mar 03 Python
Python实现双向链表基本操作
May 25 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
服务器端解压缩zip的脚本
2006/12/22 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
Python微信库:itchat的用法详解
2017/08/14 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
django rest framework 过滤时间操作
2020/07/12 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
技术学校毕业生求职信分享
2013/12/02 职场文书
找工作最新求职信
2013/12/22 职场文书
装饰活动策划方案
2014/02/11 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
Python os和os.path模块详情
2022/04/02 Python