实现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系列之从文件读取和保存数据
May 23 Python
如何在Python中编写并发程序
Feb 27 Python
Python创建xml文件示例
Mar 22 Python
Python 类的继承实例详解
Mar 25 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
Nov 06 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
Python如何实现机器人聊天
Sep 10 Python
Python实现的扫码工具居然这么好用!
Jun 07 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下实现农历日历的代码
2007/03/07 PHP
php 表单数据的获取代码
2009/03/10 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
Python编程之变量赋值操作实例分析
2017/07/24 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
python中round函数保留两位小数的方法
2020/12/04 Python
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
初中同学会活动方案
2014/08/22 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
校园广播站开场白
2015/06/01 职场文书
中学教代会开幕词
2016/03/04 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
Python3 如何开启自带http服务
2021/05/18 Python