エラー終了した場合の再コンパイル(その1)

プログラムを実行したときに、プログラム中に定義した変数の値が不適切なためエラー終了することがある。その場合に、変数に値を適切なものに書き換えてプログラムの再コンパイルを行いたい。コンパイル終了後には再びプログラムを実行しなおす。
これら一連の処理を自動的に行うように、Pythonスクリプトで処理する。

手順としては、

  1. プログラム実行時のエラーを検知する。
  2. 問題がある変数を抽出し、正しい値をどっかから持ってくる。
  3. プログラムのソースコードの中に定義されている変数の値を書き換える。
  4. プログラムを再コンパイルする。
  5. プログラムを再実行する。

となる。

本当はプログラムで定義している変数を、一つのファイルでまとめて定義してもらうと楽なのだが、プログラムの方はあまりいじれないという前提で今回の作業を行う。
”初めてのPython”を読みつつ、文字列処理に苦労しながら、手順(3)(4)を行うスクリプトを書いてみた。awkとかシェルスクリプトでやるよりもやはり見やすい(気がする)。でも初心者のコードなのでまだ無駄が多いかもしれない。

手順(3)用 process03.py

#!/usr/bin/env python

""" process03.py
"""
import sys

prgname = 'xxxx%s' % '.f'
varname = 'EE'
newval  = '500000'

input = open(prgname, 'r')
L = input.readlines()
input.close()

ipoint = -1
# find a line including variable definitions
for s in L:
   ipoint +=1
   if s.find('PARAMETER') != -1 and s.find('PP') != -1:
       defline = s
       defpoin = ipoint

# getting a value of varname
deflist = defline.split()
meindex = deflist.index(varname)
mevalue = deflist[meindex+2]

newline = defline.replace(mevalue, newval+',')

# reconstruct input file
L[defpoin] = newline

output = open(prgname, 'w')
output.writelines(L)
output.close()

これでソースコードの中に変数に新しい値が入り、ソースコードが上書きされる。

手順(4)用 process04.py

#!/usr/bin/env python

""" process04.py
"""
import sys
import popen2

prgname = 'XXXX'
output = 'log.make_%s' % prgname
fd = open(output, 'w')

cmd_name = 'make PROG=%s' % prgname
r, w, e = popen2.popen3(cmd_name)

success = True

while True:
    s = r.readline()
    if s == '':
        break
    if fd:
        fd.write(s)

s = e.read()
if s:
    success = False
    if fd:
        fd.write(s) 

これでコンパイルされる(あっ、fdをクローズしていない)。でもコンパイルが失敗したときはプロセスが止まってしまう。だが、そこまで面倒は見切れないか。

これらのスクリプトは単独で実行できることは確認。最後に適当につなげて連続実行する予定。