コンソールウィンドウのタイトルをセットする(Windows) – (3)

ちなみについでなので、はいつものパターン。

例によって、「じゃぁこれを Python からやる方法ってない?」てわけだ。

その前におさらい:

  1. cmd.exe からなら title コマンドだけでいい
  2. Windows な「コンソールウィンドウ」も vt100 互換なので、"\033]0;aaa\007" 送信技が使える、ゆえ、
    • bash から echo -n とか printf とか駆使してこれを送り込めば、タイトルを変更出来る

そして「なーんだ」と:

1 import sys
2 sys.stdout.write("\033]0;aaa\007")

を試み、愕然とするわけである。

実はこれ、凄く古い Python だと出来た。手持ちじゃないので現物で確認は出来ないが、確か 2.5 か 2.4 までは出来た。そして今どうしてこれが出来なくなったかといえば、「sys.stdout が賢くなったから」、かな、多分。以前より中間層が充実しちゃってるに違いない、詳しくは知らんけど。

ちょっと重たいので virtual box 立ち上げてまで確認する気にはなれないけど、「*nix な *term」相手だとこれでうまくいくかもしれない。ただもしこれでうまく動作しないようならやはり curses ライブラリのお世話になるかと思う。

Windows CPython な件の振る舞いについて迂回する手段は何種類かあったように思うが、一番素直なのは「ダイレクトにコンソールライブラリの機能を使う」である:

title という名のスクリプト、にしてみる
 1 #! /bin/env python
 2 import sys
 3 from time import sleep
 4 import ctypes
 5 from ctypes import LibraryLoader
 6 windll = LibraryLoader(ctypes.WinDLL)
 7 from ctypes import wintypes
 8 
 9 SetConsoleTitleW = windll.kernel32.SetConsoleTitleW
10 SetConsoleTitleW.argtypes = [
11     wintypes.LPCWSTR
12 ]
13 SetConsoleTitleW.restype = wintypes.BOOL
14 
15 for s in sys.argv:
16     SetConsoleTitleW(s)
17     sleep(1)

ワタシのように .bashrc で PS1 をごにょごにょしてる人 はこのスクリプトの効果がわかりずらいので sleep 入れてるが、そもそもこういうことをしたいのは、「永続的に変えたいから」ではなくて、何かしらの進捗状況表示の目的だろうから、実際の適用で sleep が必要になることはなかろう。

てわけで *nix、windows ともに「出来る」、はず。

ただ基本的にこれを「アプリケーションの好意」として実装するのには慎重になって欲しいと願う、個人的には。こういうのはエンドユーザがそうしたいかどうかを決めるべきであって、アプリケーションに勝手きままにこれをやられると大抵迷惑だ。