实现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 列表理解及使用方法
Oct 27 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
Python Pexpect库的简单使用方法
Jan 29 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
python 两个数据库postgresql对比
Oct 21 Python
python3获取文件中url内容并下载代码实例
Dec 27 Python
Python configparser模块封装及构造配置文件
Aug 07 Python
python批量生成条形码的示例
Oct 10 Python
如何一键升级Python所有包
Nov 05 Python
Python类class参数self原理解析
Nov 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
js实现秒表计时器
2019/12/16 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
轻松掌握python设计模式之策略模式
2016/11/18 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
使用Python实现批量ping操作方法
2020/05/06 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
python 如何区分return和yield
2020/09/22 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
党校学习思想汇报
2014/01/06 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
个人委托书
2014/07/31 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
小学运动会加油词
2015/07/18 职场文书
Mysql中mvcc各场景理解应用
2022/08/05 MySQL