2012-07-24 128 views
1

我試圖從python腳本運行一些學生FORTRAN程序。這些程序不是以任何特定的順序編寫的,而且通常依賴於簡單的FORTRAN read(*,*)命令。一個簡單的程序可能是:Python子進程允許用戶交互

program main 
    implicit none 
    real :: p,t 
    write(*,*)'Enter p' 
    read(*,*)p 
    write(*,*)'Enter t' 
    read(*,*)t 
    write(*,*)p,t 
end program main 

此代碼暫停並允許用戶根據提示輸入某些信息。我希望通過使用子進程Popen命令來獲得類似的功能。腳本在運行之前不知道輸入是什麼,或者甚至需要發生。

目前,對沒有必要的輸入程序下面的腳本作品:

p = sub.Popen('./file',stdout=sub.PIPE,stderr=sub.PIPE,stdin=sub.PIPE,shell=True) 
output,error = p.communicate() 

有沒有什麼辦法讓腳本運行在終端輸入數據的程序正在運行?

回答

3

它看起來像你想使用pexpect

import pexpect 
child = pexpect.spawn('student_program') 
while child.expect('Enter (\w+)\r\n', pexpect.EOF) == 0: 
    if child.match[1] == 'p': 
     child.sendline('3.14159') 

要通過程序的交互控制權交給用戶,使用child.interact()

+0

可以將「輸出」輸出回到python程序嗎?這將有所幫助。 – 2012-07-24 17:29:36

+0

是的,你可以使用'output_filter'回調參數'interact()'或'logfile'屬性。 – ecatmur 2012-07-25 08:14:04

相關問題