2011-07-28 29 views
1

我使用python的pexpect創建一個程序,允許用戶通過網站與FORTRAN程序進行交互。從FORTRAN程序我收到的錯誤:使用Pexpect通過命令行連接Python與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的參數是空的(例如p.sendline()),還是僅包含空格,則程序前進按預期方式。在將非空格值發送給FORTRAN程序時,是否需要以某種方式指定輸入格式?

+0

這並不值得繼續。如果您需要更多幫助,則需要提供有關程序的更多數據以及如何使用它們,特別是Fortran程序如何獲取數據。 – GreenMatt

+0

關於pexepect的一個非常重要的點:它只能在linux下運行。有一個Windows端口,但我遇到了很多問題讓它在我的盒子上運行。 –

回答

1

pexpect模塊是我以前沒用過的東西,但可能對我有用,所以我試了一下。

編輯:

我已經無法複製您報告的錯誤。看着這個錯誤讓我相信它與從文件中讀取有關,這可能是其他問題的結果。從我所看到的情況來看,這不是直接處理的事情;不過,您可能可以使用管道工作,例如下面的原始答案中的示例。

我沒有問題發送數據到Fortran的I/O流5(標準輸入)。我創建了一個名爲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.run()樣本將幫助你。至少它似乎運行我的返流程序(即接受輸入一個簡單的Fortran程序,然後打印出來):

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

產量爲:

Your entry?
42

凡返流打印出一個「你條目?」提示符,並且該四十二個文件包含「42」(在兩種情況下均不含引號)。

+0

這個問題似乎是與發送換行符。如果我child.sendline('42'),我得到上述錯誤。 child.sendline(),child.sendline(「」)或任何只有內容空白的參數不會產生錯誤。我也嘗試過下面的child.send('42'),它可以工作,但不會因爲現在跟蹤CR/LF而用「child.sendline()」提交內容,但會再次出現上述錯誤。你知道還有什麼我可以嘗試解決這個問題嗎? –