2016-07-30 61 views
1

我無法保持子流程創建的用於激發多個命令的隧道。
第一我試圖此執行一個子流程如何讓一個子進程繼續運行並在python中繼續提供輸出呢?

command=['gdb'] 
process=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
(out,err)=process.communicate("""file demo 
b main 
r 
""") 
print out 

然後我在第一種情況下嘗試這種

command=['gdb'] 
process=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
process.stdin.write("b main") 
process.stdin.write("r") 
print repr(process.stdout.readlines()) 
process.stdin.write("n") 
print repr(process.stdout.readlines()) 
process.stdin.write("n") 
print repr(process.stdout.readlines()) 
process.stdin.write("n") 
print repr(process.stdout.readlines()) 
process.stdin.close() 

它執行這些命令,然後退出所述GDB使得不可能保持suplying命令入庫和在第二種情況下,它不會在b main命令(即gdb退出)後執行。
因此,我如何繼續從程序給我更多的命令給gdb,因爲我需要。以及如何在每個命令執行後獲得gdb的輸出。
命令給予GDB在一開始並不知道他們只能通過Python程序的用戶,以便通過長串在 process.communicate 不會幫助

回答

1

如注意到的,communicate()readlines()不適合該任務,因爲它們在gdb的輸出結束之前不會返回,即gdb退出。我們希望讀取gdb的輸出,直到它等待輸入;要做到這一點的方法之一是閱讀,直到出現gdb的提示 - 請參見下面的功能get_output()

from subprocess import Popen, PIPE, STDOUT 
from os   import read 
command = ['gdb', 'demo'] 
process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 

def get_output(): 
    output = "" 
    while not output.endswith("\n(gdb) "): # read output till prompt 
     buffer = read(process.stdout.fileno(), 4096) 
     if (not buffer): break    # or till EOF (gdb exited) 
     output += buffer 
    return output 

print get_output() 
process.stdin.write("b main\n")    # don't forget the "\n"! 
print get_output() 
process.stdin.write("r\n")     # don't forget the "\n"! 
print get_output() 
process.stdin.write("n\n")     # don't forget the "\n"! 
print get_output() 
process.stdin.write("n\n")     # don't forget the "\n"! 
print get_output() 
process.stdin.write("n\n")     # don't forget the "\n"! 
print get_output() 
process.stdin.close() 
print get_output() 
0

我會沿着

線使用的東西進入
with Popen(command, stdin=PIPE, stdout=PIPE) as proc: 
    for line in proc.stdout: 
     proc.stdin.write("b main") 

這將允許您在讀取進程中的行時向進程寫入行。

+0

它給AttributeError的'用POPEN(命令,標準輸出=管,標準輸入= PIPE)爲PROC: AttributeError的:__exit__' – kar09

+0

我不想在旅途中執行多個命令。執行一個命令並得到它的輸出,然後執行下一個命令,這個命令將由用戶給出並得到它的輸出等是很重要的。只是在外出時執行10-20個不同的命令並不是必需的,但我希望保持子進程處於活動狀態,然後向其中添加文本命令,我該怎麼做? – kar09

+0

with語句應該在您讀取和寫入時保持進程正常運行。問題在於,您在嘗試獲取所有輸出時沒有提供輸出的通信方法(無返回值) –