1

私は python で pexpect を使用して、ユーザーが Web サイトを介して FORTRAN プログラムと対話できるようにするプログラムを作成しています。FORTRAN プログラムから、次のエラーが表示されます。

open: Permission denied apparent state: unit 4 named subsat.out.55 last format: list io lately writing sequential formatted external IO 55

私がしようとすると:

p = pexpect.spawn(myFortranProgram,[],5)
p.logfile_read = sys.stdout
p.expect("(.*)")
p.sendline("55")

私の理解では、55 を間違った入力ユニットに送信している可能性があります。Python で pexpect を使用して FORTRAN プログラムに入力を正しく送信するにはどうすればよいですか?

ありがとうございました。


編集: p.sendline のパラメーターが空 (egpsendline()) の場合、またはスペースのみが含まれている場合、プログラムは期待どおりに処理されます。スペース以外の値を FORTRAN プログラムに送信する場合、何らかの方法で入力形式を指定する必要がありますか?

4

1 に答える 1

1

pexpect モジュールは、これまで使用したことがなかったものですが、便利かもしれないので、これを試してみました。

編集:

ご報告いただいたエラーを再現できませんでした。このエラーを見ると、ファイルからの読み取りに関係があると思われます。これは、他の問題の結果である可能性があります。私が見たところ、これは pexpect が直接処理するように設計されたものではありません。ただし、以下の元の回答の例のように、パイプで機能させることができる場合があります。

Fortran の I/O ストリーム 5 (stdin) にデータを送信するのに問題はありません。「 Your entry? 」プロンプトを発行し、I/O ストリーム 5 でユーザーから入力行を取得し、それを出力する regurgicate という Fortran プログラムを作成しました。次のコードは、そのプログラムで動作します。

import pexpect
child = pexpect.spawn('./regurgitate')
child.setecho(False)
ndx = child.expect('.*Your entry?.*')
child.sendline('42')
child.expect([pexpect.EOF])
print child.before
child.close()

出力は次のとおりです。

42

まさに私が期待したものです。ただし、Fortran プログラムが別のことを言うと (「Your input?」など)、pexpect がハングするか、タイムアウトになります。

元の提案:

おそらく、この pexpect.run() サンプルが役に立ちます。少なくとも、私の逆流プログラム (入力を受け入れて出力する単純な Fortran プログラム) を実行しているようです。

import pexpect
out = pexpect.run('/bin/bash -c "/bin/cat forty-two | ./regurgitate"')
print out

出力は次のとおりです。

あなたのエントリー?
42

逆流すると「あなたのエントリは?」というメッセージが表示されます。プロンプトと 42 ファイルには "42" が含まれています (どちらの場合も引用符なし)。

于 2011-07-28T20:37:43.347 に答える