RSS

ttyをPythonで扱う

ダウンロードの進行表示ってどうやってんのかねと思った次第。

    付与されたタグ:
  • Python

例えばダウンロードの表示をコンソールでやるとして流れていかないで同じ行で表示させているのはどうなってるいのかというのをしらべる。ttyをいじるんだなってのはわかってpythonのttyモジュールを調べたがあんまり解説がないねと。詳解UNIXプログラミングなんぞを久しぶりにひっぱりだしてごにょごにょやってみた。

import tty
import sys
import time
import signal

from pprint import pprint

from termios import *

mode = tcgetattr(sys.stdout)

def handler(signum, frame):
    print "signal\n"
    tcsetattr(sys.stdout, TCSAFLUSH, mode)
    sys.exit(0)

signal.signal(signal.SIGINT, handler)

tty.setcbreak(sys.stdout)
for i in range(20):
    if i % 3  == 0 and i > 0:
        sys.stdout.write("\n" )
      
    sys.stdout.write("%d\r" % i )
    sys.stdout.flush()
    time.sleep(1)

tcsetattr(sys.stdout, TCSAFLUSH, mode)

 

こんな感じですかね。Control-Cを処理できないと何かと面倒なのでsignal処理も付け加える。