Pythonでローディングのぐるぐるを表示する

この記事はCAMPHOR- Advent Calendar 2014の21日目の記事です。

こんにちは、@morishin127です。

今日はPythonで処理中のぐるぐるを表示する方法を紹介します。
これです。
run

npm installとかで出てくるあれですね。

これがソースコードです。
Python 3 で書いていますが、2 でも動くようにはしています。

from __future__ import print_function
import sys


def spinner_gen():
    while 1:
        yield '|'
        yield '/'
        yield '-'
        yield '\\'


if __name__ == '__main__':
    for spinner in spinner_gen():
        print(spinner + '\033[1D', end='', file=sys.stderr)

ぐるぐるの棒を表す4種類の文字の繰り返しを、ジェネレータを使って無限列で表しています。

印字部分のコードは下記のようになっています。

\033[1Dの部分は、「カーソルを1つ左へ移動」する制御文字です。

棒を1文字出力して、カーソルを1つ左へ移動させ、また次の棒を1文字入力…の繰り返しで回転のアニメーションを実現しています。

ぐるぐるがプログラムの結果の出力に混ざってしまうのを防ぐため、file=sys.stderrで標準エラー出力にしています。
結果をファイル出力しても、こうしておくと混ざりません。

時間のかかる処理で何も表示されないと、異常があって止まっているのか単なる処理待ちなのか分からないので、このようなぐるぐるを表示させると良いと思います。
gemもなんか出してほしい。

余談

余談ですが、\033[1Dのような制御文字は他にも色々あります。

コマンドラインで

と打つとたくさん出てきます。

なんか色々あってよく分からないですが、使えそうなのいくつか。
\033[0mは前に変えたスタイルのリセットです。
infocmp

コマンドラインツールのログ表示に便利そうです。
是非使ってみてください。

明日はyaitaimoの記事です。お楽しみに〜〜


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です