Python中的超时子进程

时间:2014-09-29 11:16:18

标签: python adb

def adbshell(command, serial=None, adbpath='adb'):
    args = [adbpath]
    if serial is not None:
        args.extend(['-s', serial])
    args.extend(['shell', command])
    return subprocess.check_output(args)



def pmpath(serial=None, adbpath='adb'):
    return adbshell('am instrument -e class............', serial=serial, adbpath=adbpath)

我必须在特定时间段内运行此测试,然后如果它不起作用则退出。我如何提供超时?

2 个答案:

答案 0 :(得分:1)

根据您正在运行的Python版本。

Python 3.3以后:

subprocess.check_output()提供了timeout个参数。签名签名here

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False, timeout=None)

Python 3.3以下:

您可以使用threading模块。类似的东西:

def run(args, timeout):
    def target():
        print 'Start thread'
        subprocess.check_output(args)
        print 'End thread'

    thread = threading.Thread(target=target)
    thread.start() # Start executing the target()

    thread.join(timeout) # Join the thread after specified timeout

注意 - 我没有使用threadingcheck_output()测试上面的代码。通常我使用subprocess.Popen(),它提供了更大的灵活性,几乎可以处理所有场景。查看doc

答案 1 :(得分:1)

Popen结构提供了更大的灵活性,因为它可用于检查subprocess调用的退出状态。

如果进程尚未终止,Popen.poll将返回None。因此,请将子进程sleep调用所需的超时时间。

考虑一个简单的test.py,这是从主程序调用的子进程。

import time

for i in range(10):
        print i
        time.sleep(2)

使用test.py

从另一个程序调用{​​{1}}
subprocess.Popen

from subprocess import Popen, PIPE import time cmd = Popen(['python','test.py'],stdout=PIPE) print cmd.poll() time.sleep(2) if cmd.poll()== None: print "killing" cmd.terminate()

提供超过2秒的时间,以便程序可以执行。 使用time.sleep(2)

检查流程的退出状态

如果Popen.poll,进程尚未终止,则会终止进程。