サブプロセスの実行手順(サブプロセス用の入力ファイル作成とサブプロセスの実行)
Pythonとは別のプログラム言語で作成したプログラムを、wxPythonのGUIから実行するときの手順をまとめておく。以前からたびたびやっているのだが、やるたびにどう書くのか迷ってしまうので。
まずは、ProgramTest.py。
これはモジュールで、入力ファイル(file_name)を引数としてどこかで呼ばれる。
プログラム(サブプロセス)a.outの実行のために必要なデータを、リストにしている。
import sys import ExecCmd def ProgramTest(file_name): cmd_name = 'a.out' # プログラム名を指定 output = '%s.log' % cmd_name # ログファイル名を指定 val_dist = 0 val_conf = 1 fl_name1 = file_name[:-4] + '.M' # 入力データファイルの拡張子を変更 fl_name2 = file_name[:-4] + '.B' fl_name3 = 'dummy' # 入力データファイル名を指定 lines = [] # リストを定義(プログラムに読み込ませるファイル) lines.append("%s\n" % fl_name1) # リストに入力データを追加する lines.append("%s\n" % fl_name2) lines.append("%s\n" % fl_name3) lines.append("%s\n" % val_dist) lines.append("%s\n" % val_conf) fd = open(output, 'w') ExecCmd.execmd(cmd_name, lines, fd) # 別モジュールでコマンドを実行する
以下は、モジュールExecCmd.py。
これは確か以前も書いた気がする。
import sys import popen2 import time def execmd(cmd_name, lines, output): """ start sub-process """ print 'inf> start %s [%s]' % (cmd_name, time.ctime(time.time())) r, w, e = popen2.popen3(cmd_name) success = True for x in lines: w.write(x) if lines: try: w.flush() except: success = False while True: s = r.readline() if s == '': break if output: output.write(s) s = e.read() if s: # print s if output: output.write(s) if not success or r.close() or w.close() or e.close(): success = False print 'err> failed %s [%s]' \ % (cmd_name, time.ctime(time.time())) else: print 'inf> done %s [%s]' % (cmd_name, time.ctime(time.time())) return success