簡體   English   中英

在Python中捕獲終端輸出

[英]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.killos.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM