3

Python のシェルで Fortran プログラムを実行しようとしています。Fortran プログラムを呼び出して引数を渡すために使用subprocessしています (2 つの入力ファイルが必要です)。これは私がそれを行う方法です:

COMMAND = '/path/to/FORTRAN/program << !\n' + INPUT_FILE1 + '\n' + INPUT_FILE2 +'\n!'
return = subprocess.call(COMMAND, shell=True)

残念ながら、Fortran プログラムは次のように終了します。

? FORTRAN Runtime Error:
? Attempt to read past end of file
? READ(UNIT=22,...

これは、入力ファイルや Fortran プログラムの問題ではありません。シェルでこれを実行すると:

$>/path/to/FORTRAN/program << !
>INPUT_FILE1
>INPUT_FILE2
>!

すべてが期待どおりに機能します (いいえAttempt to read past end of file)。

Fortran のソースにアクセスできないので、そこで何が起こっているのかを確認できません。プログラムを呼び出す方法に関係していると思いますsubprocess-何がわからないのですか。

Python 2.6.6 を使用しています。

簡単な説明: Fortran プログラムは 2 つの入力ファイルを要求しますが、それらをコマンド ライン オプションとして認識しません (プログラムの呼び出しで指定することはできません)。シェル スクリプト (バッチ モード) などから実行する場合は、return コマンドをキャプチャしてコマンドを実行する必要がありますが、2 つのファイルも提供する必要があります。は<< !、より適切な用語がないための「リスト」を開きます。次のコマンドは、入力されるまで実行を待機するプログラムに渡されます!

私はこのアプローチを何度も成功させました (Fortran コードは異なります)。このアプローチでは、C シェルスクリプト (Python ではありません) を使用しました。

4

3 に答える 3

1

shell=Trueシステムで呼び出されない場合は、で呼び出されたシェルが原因である可能性がありbashます。拡張シェル構文に依存することを避け<<、代わりに次のように呼び出し全体を独自に構築できます。

popen = subprocess.Popen(["/path/to/FORTRAN/program"], stdin=subprocess.PIPE)
popen.stdin.write('123\n')
time.sleep(0.1)    # hack, following LAK's suggestion
popen.stdin.write('456\n')
popen.stdin.close()
result = popen.wait()
于 2013-03-28T21:54:36.107 に答える
1

しばらく前に同様の問題があった可能性があり、解決策は小さな一時停止を追加することであることが判明しました。これを見て、そのテクニックが役立つかどうかを確認してください。

于 2013-03-29T20:18:19.020 に答える