实现python版本的按任意键继续/退出

某天在群内有同学问到,在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模式.

(0)

相关推荐

  • python实现按任意键继续执行程序

    在windows下写bat的时候,通过pause命令,可以暂停程序运行,例如经常见的程序会在终端提示"按任意键继续--",用户在终端回车后程序可以接着运行,这个功能有多大用途今天暂且不说,但我觉得应该有很多人也想在python下实现这个功能,这样当自己写的python程序运行时, 突然给出这么一个提示,然后自己再来个帅气的回车,我觉得肯定给人一种非常专业的感觉,最起码自己肯定被自己迷倒了,所以今天我们就学习下这段代码,这里定义了一个函数,所以你可以嵌入到你的程序中,在任何你希望调用的地

  • 详解Python实现按任意键继续/退出的功能

    前言 要实现该功能,需要的就是暂停程序.等待并捕捉用户的一个键盘输入,然后继续执行.Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux. msvcrt 中的 getch() 方法 能够帮助在 Windows 下实现,其作用是获取一个按键响应并返回对应的字符.它并不在命令行中回显.有如下程序段: import msvcrt print ord(msvcrt.getch()) 这里利用 ord 将获得的字符转换为 ASCII 数值,例如捕获按键"d"

  • Linux 下 Python 实现按任意键退出的实现方法

    某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要还是Linux下的. 当然,Windows系统下会稍微简单一些,Windows系统下如果你安装了python的环境,默认自带的一个模块叫做msvcrt,import msvcrt,然后调用msvcrt.getch()即可.接下来即Linux下实现python版本的按任意键退出. 初学Python时在

  • 实现python版本的按任意键继续/退出

    某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要还是Linux下的. 要实现该功能,需要的就是暂停程序.等待并捕捉用户的一个键盘输入,然后继续执行.Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux. 当然,Windows系统下会稍微简单一些,Windows系统下如果你安装了python的环境,默认自带的一

  • 更改Ubuntu默认python版本的两种方法python-> Anaconda

    你可以按照以下方法使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用. $ ls /usr/bin/python* /usr/bin/python /usr/bin/python2 /usr/bin/python2.7 /usr/bin/python3 /usr/bin/python3.4 /usr/bin/python3.4m /usr/bin/python3m 执行如下命令查看默认的 Python 版本信息: $ python --version Python 2.

  • Linux更新Python版本及修改python默认版本的方法

    linux下更新Python版本并修改默认版本,有需要的朋友可以参考下. 很多情况下拿到的服务器python版本很低,需要自己动手更改默认python版本 1.从官网下载python安装包(这个版本可以是任意版本3.3 2.7 2.6等等) wget http://python.org/ftp/python/2.7/Python-2.7.tar.bz2 2.解压并安装 tar -jxvf Python-2.7.tar.bz2 cd Python-3.3.0 ./configure make al

  • pyenv命令管理多个Python版本

    从接触Python以来,一直都是采用 virtualenv 和 virtualenvwrapper 来管理不同项目的依赖环境,通过 workon . mkvirtualenv 等命令进行虚拟环境切换,很是愉快. 然而,最近想让项目能兼容更多的Python版本,例如至少同时兼容 Python2.7 和 Python3.3+ ,就发现采用之前的方式行不通了. 最大的问题在于,在本地计算机同时安装 Python2.7 和 Python3 后,即使分别针对两个Python版本安装了 virtualenv

  • ubuntu 16.04下python版本切换的方法

    本文主要是记录ubuntu 16.04下python环境配置,具体内容如下 对于ubuntu 16.04,由于本身是自带python,这样就减少了在windows下的下载和环境变量配置,非常不错.但是他本身是自带两个版本的python,2.X和3.X,两个版本,两个版本默认的是使用2.X,毕竟3.X是一个趋势,今后我这边应该也会主要使用3.X版本,所以这里记录一下如果在版本间切换以及如何把python版本切换到3.X下的方法. 一.确认本机下的python默认版本.调出终端,输入python即可

  • Ubuntu18.04下python版本完美切换的解决方法

    ubuntu18.04版本,python版本python2.7,python3.5,python3.6 因为安装一些库会安装到python3.6上,而默认使用的是python2.7,使用python3,默认会使用python3.5,无法调用安装包. 解决方法: 一.使用python xx.py运行程序时,加上版本号.比如python3.6 xx.py 二.1.要以root身份操作 yz@yz-pc:~$ sudo su 2.确认本机下的python默认版本.调出终端,输入python即可查看默认

  • python版本的读写锁操作方法

    本文实例讲述了python版本的读写锁操作方法.分享给大家供大家参考,具体如下: 最近要用到读写锁的机制,但是python2.7的自带库里居然木有. 网上讲读写锁的例子众多,但是原理简单,代码明晰的却不多见, 索性自己写个. 读写锁一般用于多个读者,1个或多个写者同时访问某种资源的时候.多个读者之间是可以共享资源的,但是写者与读者之间,写者与写者之间是资源互斥的. 这也就是说同时可以有多个读者或一个写者处于工作状态. 细分下来,读写锁可以分为三类,读者优先,写者优先和公开策略. 第一种,读者优先

随机推荐