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