快速而簡單:我打電話給一個進程使用subprocess.popen,它可以在cmd /終端連續運行。如果在cmd/terminal中顯示某個文本字符串,我想調用一個函數。我將如何做到這一點?我對Python非常陌生,所以最簡單的解決方案可能是最好的解決方案。通過python監測外殼
非常感謝!
快速而簡單:我打電話給一個進程使用subprocess.popen,它可以在cmd /終端連續運行。如果在cmd/terminal中顯示某個文本字符串,我想調用一個函數。我將如何做到這一點?我對Python非常陌生,所以最簡單的解決方案可能是最好的解決方案。通過python監測外殼
非常感謝!
您正在查找的輸出是來自stdout
或stderr
。我們假設它來自stdout
。 (如果是從stderr
來的解決方案是類似的,只是改變stdout
到stderr
,下文。)
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']
與任何命令你的願望。
@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的解決方案完美的作品以及你的具體情況。我只是爲了完整而添加它...
工作完美,非常感謝! –
其實,還有一個小問題,如果我要找的字符串不在該行的開頭,我該如何做?是一個line.contains()方法,或類似的東西? –
使用「if」字符串我正在查找「in line」。 – unutbu