-1

我使用 Popen() 来生成程序?该程序将在程序中显示“文本”?

如何监控我生成的程序的状态?如何确定 1 分钟内是否没有任何打印输出,我假设程序挂起并且我需要终止进程“p”?

# command is my command to run
p = subprocess.Popen(command,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)
4

1 回答 1

0

这主要基于python 中 subprocess.PIPE 的非阻塞读取

我们使用单独的线程和队列在一定时间后检查输出,在q.get(timeout=5)部分中给出。60如果您只想在 60 秒后终止进程,请将其更改为。将第一个参数更改为subprocess.Popen要运行的适当命令。

import Queue
import subprocess
import threading

def checkStdout(p, q):
    s = p.stdout.read(1)
    if len(s) > 0:
        q.put(s)

def run():
    p = subprocess.Popen(['cat'], stdout=subprocess.PIPE, close_fds=True)
    print 'pid %d started' % p.pid
    q = Queue.Queue()
    t = threading.Thread(target=checkStdout, args=(p, q))
    t.daemon = True
    t.start()
    try:
        canGet = q.get(timeout=5)
        print 'has output'
    except Queue.Empty:
        print 'no output'
        # kill process
        p.kill()

if __name__ == '__main__':
    run()
于 2013-08-04T04:36:26.787 回答