2011-07-28 23 views
1

私はPythonでpexpectを使用して、ユーザーがWebサイトを通じてFORTRANプログラムとやりとりできるプログラムを作成しています。私がしようとするとPexpectを使用した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を送っていますFORTRANのプログラムから私はエラーが表示さです。 Pythonでpexpectを使用してFORTRANプログラムに入力を正しく送信するにはどうすればよいですか?

ありがとうございます。


編集: p.sendlineのパラメータが空である場合(例えばp.sendline())または予想通りスペースのみ、移行を含んでいます。空白以外の値をFORTRANプログラムに送る際に、何らかの形で入力形式を指定する必要がありますか?

+0

それほど進んでいません。より多くのヘルプが必要な場合は、プログラムに関するデータと使用方法、特にFortranプログラムがどのようにデータを取得するかについて、より多くのデータを提供する必要があります。 – GreenMatt

+0

pexepectについての非常に重要な点:linuxでのみ動作します。 Windowsのポートがありますが、私はそれを私のボックスで動かすために多くの問題に遭遇しました。 –

答えて

1

pexpectモジュールはこれまで私が使っていなかったものですが、私にとっては有益なことかもしれませんので、試しました。

編集:私はあなたが報告しているエラーを再現することができていませんでした

。このエラーを見ると、他の問題の結果であるかもしれないファイルからの読み込みと関係があると私は信じています。私が見たことから、これはpexpectが直接扱えるように設計されたものではありません。しかし、私の元の答えの例のように、パイプで作業させることができます。

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

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プログラムが何か別のことを言うなら(例えば、あなたの入力?)、pexpectはちょうどハングするかタイムアウトします。

オリジナルの提案:

多分これpexpect.run()サンプルがお手伝いします。少なくとも私の逆流プログラム(入力を受け付け、それをプリントアウトし、簡単なFortranのプログラム)を実行しているようだ:

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

出力した:

Your entry?
42

逆流プリントアウト「あなたのエントリ?"プロンプトが表示され、42個のファイルには "42"(どちらの場合でも引用符は含まれません)が含まれています。

+0

問題は改行が送信されているようです。もし私child.sendline('42 ')、私は上記のエラーを取得します。 child.sendline()、child.sendline( "")、またはコンテンツの空白だけを持つパラメータではエラーは発生しません。私はchild.send('42 ')にも従ってみましたが、それは動作しますが、child.sendline()で後続のCR/LFのためにコンテンツを "提出"しませんでしたが、上記のエラーが再び発生します。この問題を乗り越えるために他に何かを知っていますか? –

関連する問題