サブプロセスの実行手順(サブプロセス用の入力ファイル作成とサブプロセスの実行)

Pythonとは別のプログラム言語で作成したプログラムを、wxPythonGUIから実行するときの手順をまとめておく。以前からたびたびやっているのだが、やるたびにどう書くのか迷ってしまうので。

まずは、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