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)
我必须在特定时间段内运行此测试,然后如果它不起作用则退出。我如何提供超时?
答案 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
注意 - 我没有使用threading
和check_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
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
,进程尚未终止,则会终止进程。