[英]Catching Terminal Output in Python
我想在這里做類似於第二個答案的事情(但不太相似): 在Linux中工作時模擬Ctrl-C鍵盤中斷
它更簡單,我想我只是缺少一些東西。 比方說,從python腳本,我只想調用'ping'並在第10次后終止它。 我試圖像上面的鏈接那樣做:
p = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE)
for line in p.stdout:
print line
if re.search('10', line):
break
os.kill(p.pid, signal.SIGINT)
但它不起作用。
而且我還希望顯示'ping'的常規輸出。 我該怎么做呢?
編輯:這實際上並不是我想做的'ping'。 我只是用它作為連續輸出命令的一個例子,我想及時終止它。
更具體地說,我正在運行一個舊版本的BitTorrent(來自第3個答案的v5.0.9: 在哪里找到BitTorrent源代碼? )我正在通過python腳本調用它。 bittorrent-console.py是一個簡單的終端版本,因此是“控制台”。 它定期輸出多行。 就像是:
saving: filename
file size: blah
percent done: 100.0
blah: blahblah
我實際上是通過以下方式調用它:
subprocess.call(['./bittorrent-console.py', 'something.torrent'])
我想在'百分之百完成'中看到它是100.0時自動終止它。
編輯:我正在運行CentOS,Python 2.6。
首先,您要使用p.stdout.readline
。 我不知道為什么,但是for line in p.stdout
中的for line in p.stdout
似乎沒有沖洗。 也許它是緩沖的。
其次,你應該使用sys.stdout.write(line)
,因為print
總是附加一些東西。 但是,在Python 3中,您可以使用print(line, end="")
。
另外,你應該更喜歡p.kill
到os.kill
。 我不確定你為什么要使用os.kill
。
import os
import signal
import subprocess
import sys
p = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE)
while True:
line = p.stdout.readline()
sys.stdout.write(line)
sys.stdout.flush()
if '10' in line:
break
p.kill()
這正是您想要的,並且在我的OS X機器上完美運行:
import subprocess
import re
def get_output(cmd, until):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
ret = []
while True:
line = p.stdout.readline()
ret.append(line)
if re.search(until, line):
break
p.kill()
return ret
print ''.join(get_output(['ping', 'google.com'], until='10'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.