これは少し説明が必要です。我慢してください。
私が持っているもの
私はいくつかの Fortran ソース コードと、そのコードからコンパイルされたいくつかのバイナリを所有しています。私はコンパイルを行いませんでしたが、G77 を使用してコンパイルしたことを示唆するビルド スクリプトがあります。
Fortran のものと同様に、バイナリの周りに GUI の「ラッパー」をユーザーに提供する Java コードもあります。入力/出力/エラー パイプを介して、自身とバイナリの間で情報を渡します。Java コードは非常に乱雑で、この方法では多くの定型文と冗長性が追加されますが、それは仕事をし、機能することを私は知っています。
私が必要なもの
残念ながら、いくつかの変更を加えたいと思います:
バイナリ用の新しい Python ラッパーを作成したい (より正確には、既存の Python プログラムを拡張して新しいラッパーにしたい)。
この既存のプログラムのビルド プロセスの一部として Fortran コードをコンパイルできるようにしたいと考えています。MinGW はビルドの他の場所で使用されているため、すぐに利用できるため、これには gfortran を使用したいと思います。
問題
gfortran を使用して自分で Fortran コードをコンパイルすると、結果のバイナリを現在の Java ラッパーまたは新しい Python ラッパーのいずれかと「対話」することができません。
Fortran コードで試したコンソールへの出力のさまざまな方法を次に示します。
subroutine printA(message)
write(6,*) message
end
subroutine printB(message)
write(*,*) message
end
subroutine printC(message)
use iso_fortran_env
write(output_unit,*) message
end
コマンドもありread
ますが、その部分を実行するためのコードも変更されていないので、まだ心配していません。
追加情報
コードがコンパイルされるように、フラグを指定して gfortran を呼び出す必要があり
-ffixed-line-length-132
ますが、それ以外には何も使用しません。私は-ff2c
漠然とした希望で旗を使ってみました。そうではありません。このスタックオーバーフローの投稿は有益ですが、機能するものは何も提供しません。
関連するマニュアルページは、printA が問題なく動作することを示唆しています。
私は Windows で作業していますが、これをマルチプラットフォームにする必要があります。
参考までに、Java コードは
Runtime.getRuntime().exec("prog.exe")
バイナリを呼び出してから、結果のProcess
オブジェクトのさまざまな「ストリーム」メソッドを呼び出してそれらと通信します。Python コードは、モジュールのPopen
オブジェクトによって提供されるこれと同等のものを使用します。subprocess
また、代替手段があることは承知しています。Python (または C++ など) でコードを書き直すか、F2Py 経由で呼び出せるように修正することは、オプションとして除外されています。g77 を使用することもできません。そのままで十分な依存関係があります。gfortran を使用してコンソールに適切に書き込み/読み取りできるようにしたい、またはそれが不可能であることを知りたいです。