とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

pyconsoleを日本語対応してみた

アプリに組み込めるコマンドラインのライブラリを探していたところ、pythonで書かれた pyconsole(http://code.google.com/p/pyconsole/) が良さげなので試そうとしたら、そもそも動きませんでした・・・なんてこったい!!
ソースをザッと眺めたところアスキーコードでしか動かない、よくあるコードだったので日本語対応しました。

before


after


環境

python 2.7.1
pywin32 build 216
windows vista 32bit

CONSOLE PROCESS ENDED が表示されないようにする

例外が発生し子プロセスが死ぬのが原因です。
最近の pywin32 は下位互換性がないようなので、pyconsole.py を書き換えます。

class _ConsoleChildProcess (_ConsoleProcessBase):
    def __init__ (self, parent_pid, lst_cmd_line):
        <snip>
        if 0:
            #original
            self.con_window = win32console.GetConsoleWindow().handle
        else:
            self.con_window = win32console.GetConsoleWindow()

文字コードを日本語(cp932)にする

親プロセスに送る文字コードを日本語(cp932)にします。

def shmem_write_text (shmem, bytes_in_use, msg_hdr_fmt, msg_hdr_tpl, msg_text):
    msg_text=msg_text.encode("cp932") #この行を追加
    bytes_in_use = max (bytes_in_use, _shmem_hdr_len)
    msg_hdr_fmt += 'i'  # int indicating length of text

デバッグ

バックグランドで動いているコンソールを表示します、こうしないと何が発生しているのかサッパリ分かりません。

def _start_console_process (self, cmd_line):
    <snip>
    si = win32process.STARTUPINFO()
    si.dwFlags |= win32con.STARTF_USESHOWWINDOW
    si.wShowWindow=win32con.SW_SHOW
    #si.wShowWindow = win32con.SW_HIDE
    # si.wShowWindow = win32con.SW_MINIMIZE


ログファイルがテンポラリディレクトリへ生成されてログを確認しにくいので、カレントディレクトリへ出力します。

_debug = True
if _debug:
    # Note: if this module is imported then the logging may be
    # started from a different module with different parameters
    if is_child():
        filename_log = 'pyconsole_child.log'
    else:
        filename_log = 'pyconsole_parent.log'
    logging.basicConfig (level=logging.INFO,
        format='%(asctime)s %(levelname)-8s %(message)s\n -- %(pathname)s(%(lineno)d)',
        datefmt='%H:%M:%S',
        filename=filename_log,
        filemode='w')
    logging.info ('starting')