实现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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python实现配置文件备份的方法
Jul 30 Python
不可错过的十本Python好书
Jul 06 Python
python爬虫基本知识
Mar 05 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
详解python metaclass(元类)
Aug 13 Python
python如何将图片转换素描画
Sep 08 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 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
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
如何使用python爬取csdn博客访问量
2016/02/14 Python
Python读csv文件去掉一列后再写入新的文件实例
2017/12/28 Python
Python笔记之facade模式
2019/11/20 Python
python函数不定长参数使用方法解析
2019/12/14 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
农业资源与环境专业自荐信范文
2013/12/30 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
中学生逃课检讨书
2015/02/17 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书