实现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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
python使用in操作符时元组和数组的区别分析
May 19 Python
Python打印“菱形”星号代码方法
Feb 05 Python
python读取和保存视频文件
Apr 16 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
使用python接受tgam的脑波数据实例
Apr 09 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
详解pandas映射与数据转换
Jan 22 Python
python scrapy简单模拟登录的代码分析
Jul 21 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将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
javascript实现画板功能
2020/04/12 Javascript
深入解析Python中函数的参数与作用域
2016/03/20 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python批量解压zip文件的方法
2019/08/20 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
房地产项目策划书
2014/02/05 职场文书
人事科岗位职责范本
2014/03/02 职场文书
大一新生学期自我评价
2014/04/09 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
市场部岗位职责范本
2015/04/15 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP