11.04.2015

Python: Terminal I/O Assessment in CygWin

Python: CygWin 環境におけるターミナル I/O 周りの調査

環境

  • OS: Windows Server 2012 R2 日本語版
  • CygWin: 2.873 (64bit)
  • Python: 2.7

 

目的

Python 上で以下の操作が可能か調べる。

  • ターミナルのエンコーディングの自動判別
  • ターミナル画面のクリア
  • ターミナル上のキー入力の検知

 

バリエーション

調査したバリエーションは以下 5 種類。

環境フロントエンドシェルPythonビルドエンコーディング
1 cmd.exe - Windows cp932
2 cmd.exe CygWin bash Windows cp932
3 cmd.exe CygWin bash CygWin UTF-8
4 MinTTY CygWin bash Windows UTF-8
5 MinTTY CygWin bash CygWin UTF-8

 

環境情報

いくつかの方法で情報を取得。(要 import platform,os,sys,locale)

#メソッド環境1環境2環境3環境4環境5
a platform.system() Windows Windows CYGWIN_NT-6.3 Windows CYGWIN_NT-6.3
b os.name nt nt posix nt posix
c os.environ.get('TERM') None cygwin cygwin xterm xterm
d os.environ.get('LANG') None ja_JP.UTF-8 ja_JP.UTF-8 ja_JP.UTF-8 ja_JP.UTF-8
e sys.stdin.isatty() True True True False True
f sys.stdin.encoding cp932 cp932 UTF-8 None UTF-8
g sys.stdout.isatty() True True True False True
h sys.stdout.encoding cp932 cp932 UTF-8 None UTF-8
i locale.getpreferredencoding() cp932 cp932 UTF-8 cp932 UTF-8

明快な判定方法は無いが、sys.stdout.encoding -> 環境変数LANG -> locale.getpreferredencoding() の順に信頼すれば良さそうに思える。

 

画面クリア

以下のメソッドの挙動を確認。(要 import subprocess)

#メソッド環境1環境2環境3環境4環境5
a subprocess.call('cls', shell=True) OK OK - - -
b subprocess.call('cmd /c cls', shell=True) - - OK - -
c subprocess.call('clear', shell=False) - - - - -
d subprocess.call(['echo', '-en', r'\ec'], shell=False) - - OK - OK
e subprocess.call(r'echo -en "\ec"', shell=False) - OK - OK -

なかなか判定条件が悩ましい。

 

キー入力の取得

msvcrt による取得が可能かどうかと、tty、curses が使えるかどうか調査。

#メソッド環境1環境2環境3環境4環境5
a msvcrt.getch() OK OK - - -
b tty.setraw(0) - - OK - OK
b curses.screen#getch() - - OK - OK

環境4 に限っては、1文字単位でキー入力を取得する手段が無いという結論となった。

 

0 件のコメント:

コメントを投稿