2013-08-24 63 views
1

快速而簡單:我打電話給一個進程使用subprocess.popen,它可以在cmd /終端連續運行。如果在cmd/terminal中顯示某個文本字符串,我想調用一個函數。我將如何做到這一點?我對Python非常陌生,所以最簡單的解決方案可能是最好的解決方案。通過python監測外殼

非常感謝!

回答

3

您正在查找的輸出是來自stdoutstderr。我們假設它來自stdout。 (如果是從stderr來的解決方案是類似的,只是改變stdoutstderr,下文。)

import subprocess 
PIPE = subprocess.PIPE 

proc = subprocess.Popen(['ls'], stdout=PIPE) 
for line in iter(proc.stdout.readline, ''): 
    if line.startswith('a'): 
     print(line) 

更換line.startswith('a')與任何條件是合適的,(當然)代替['ls']與任何命令你的願望。

+0

工作完美,非常感謝! –

+0

其實,還有一個小問題,如果我要找的字符串不在該行的開頭,我該如何做?是一個line.contains()方法,或類似的東西? –

+0

使用「if」字符串我正在查找「in line」。 – unutbu

1

@unutbu代碼的唯一問題是(但這不適用於您的情況,更一般而言)是它在每個readline調用中都會阻止您的應用程序。所以你什麼都做不了。

如果你想要一個非阻塞的解決方案,你應該創建一個文件,在寫入和讀取模式下打開它,將作者傳遞給Popen並從讀取器讀取。從閱讀器讀取將始終是非阻塞的。

import io 
import time 
import subprocess 

filename = 'temp.file' 
with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1) as reader: 
    process = subprocess.Popen(command, stdout=writer) 
    # Do whatever you want in your code 
    data = reader.read() # non-blocking read 
    # Do more stuff 
    data = reader.read() # another non-blocking read... 
    # ... 

等等......

這不適用於其中@ unutbu的解決方案完美的作品以及你的具體情況。我只是爲了完整而添加它...