2016-01-15 245 views
0

我正在寫一個腳本,它將運行一個Linux命令並將一個字符串(最多EOL)寫入標準輸入並從標準輸出中讀取一個字符串(直到EOL)。最簡單的例證是cat -命令:寫入標準輸入和讀取標準輸出的子進程python 3.4

p=subprocess.Popen(['cat', '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
stringin="String of text\n" 
p.stdin.write=(stringin) 
stringout=p.stout.read() 
print(stringout) 

我的目標是一旦打開cat -過程,並用它來多次將一個字符串寫入其標準輸入每一個正從它的標準輸出字符串的時間。

我GOOGLE了很多,很多食譜不工作,因爲語法是不兼容的通過不同的Python版本(我使用3.4)。這是我從頭開始的第一個python腳本,我發現python文檔到目前爲止是相當混亂的。

回答

0

那麼你需要communicate與過程:

from subprocess import Popen, PIPE 
s = Popen(['cat', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
input = b'hello!' # notice the input data are actually bytes and not text 
output, errs = s.communicate(input) 

使用Unicode字符串,則需要encode()輸入和decode()輸出:

from subprocess import Popen, PIPE 
s = Popen(['cat', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
input = 'España' 
output, errs = s.communicate(input.encode()) 
output, errs = output.decode(), errs.decode() 
2

謝謝您的解決方案薩爾瓦。 不幸的是communicate()關閉了cat -的過程。我沒有找到與subprocess的任何解決方案與cat -進行通信,而無需爲每個呼叫打開新的cat -。我發現了一個簡單的解決方案與pexpect雖然:

import pexpect 

p = pexpect.spawn('cat -') 
p.setecho(False) 

def echoback(stringin): 
    p.sendline(stringin) 
    echoback = p.readline() 
    return echoback.decode(); 

i = 1 
while (i < 11): 
    print(echoback("Test no: "+str(i))) 
    i = i + 1 

爲了使用pexpect Ubuntu用戶必須通過pip安裝它。如果你想爲python3.x安裝它,你必須首先從Ubuntu repo安裝pip3(python3-pip)。

相關問題