週末はいつも晴れ

社会人3年目の日記です。プログラミングとか旅行とかラーメン。

古いコードのwrapper

書きかけ


古代の計算コード(私の生まれる前に開発されたFortranコード)をpython3でwrapした経験のメモ

信頼性の観点から、新しい計算コードは認められないため(認められるためのコストが莫大になるため)、現在でも使われているコードが私の業界には多々あります。

おそらく他の業界でもよくあることでしょう。

古いコードは古い計算機で動かす前提で作成されており、並列化やパラメータサーベイ、アウトプットのポスト処理等が現状に全くマッチしません。
せっかく計算機が進歩しているのに、活用しない手は無いでしょう。

注:このポストでは古いコードのソースコードからの変更を行うものではありません。あくまでwrapperであり、実行モジュールやデータライブラリは保証・検証されているもののみを使用することを前提とします。

主に以下を達成することを目的としました。

  • インプットファイルの自動生成
  • 実行ログや日本語コメントを残せるようにすること
  • アウトプットファイルの読み込み
  • アウトプットの可視化・整理・他のアウトプットとの比較

インプットファイル

ファイルIO
入力パラメータの割り振り

実行(subprocess)

Pythonから古いコードを実行するには標準ライブラリのsubprocessを利用します。
subprocessモジュールについて私も詳細は理解できているとは言えませんが、簡単に言えばPython上で新しいコマンドプロンプトを開いて指定したシェルコマンドを実行するためのライブラリです。

主に以下のsubprocess.run()またはsubprocess.Popen()を使います:
17.5. subprocess — サブプロセス管理 — Python 3.6.1 ドキュメント
17.5. subprocess — サブプロセス管理 — Python 3.6.1 ドキュメント

単純に実行するだけならsubprocess.run()で十分です。
オリジナルの実行方法が以下であるとします。

old_program < inputfile

subprocess.run()を使用した例は以下になります。

import subprocess
cmd = 'old_program < inputfile'
subprocess.run(cmd, shell=True)

アウトプットファイル

文字列データの読み取り
数値データやcsvファイルの読み取り
バイナリ形式データの読み取り(Fortran unformatted)