使用os.system函数时设置超时

时间:2016-12-12 05:33:45

标签: python-3.x timeout os.system

首先,我想说我刚开始学习python,我想在我的python脚本中执行maven命令(参见下面的部分代码)

os.system("mvn surefire:test")

但不幸的是,有时这个命令会超时,所以我想知道如何设置超时阈值来控制这个命令。

也就是说,如果执行时间超过X秒,程序将跳过命令

还有什么,其他有用的解决方案可以解决我的问题吗?提前谢谢!

3 个答案:

答案 0 :(得分:3)

使用子进程模块。通过使用列表并坚持使用默认的$(textForMedia).fadeToggle('slow', 'linear');,我们可以在超时命中时终止进程。

shell=False

答案 1 :(得分:1)

此外,您可以在终端超时中使用:

这样做:

import os

os.system('timeout 5s [Type Command Here]')

此外,您可以使用 s、m、h、d 表示秒、分钟、小时、天。 您可以向命令发送不同的信号。如果您想了解更多信息,请参阅: https://linuxize.com/post/timeout-command-in-linux/

答案 2 :(得分:0)

简单答案

os.system不支持timeout

您可以改用Python 3的{​​{3}},它支持timeout参数

例如:

yourCommand = "mvn surefire:test"
timeoutSeconds = 5
subprocess.check_output(yourCommand, shell=True, timeout=timeoutSeconds)

详细说明

此外,我还为您封装了一个函数subprocess

def getCommandOutput(consoleCommand, consoleOutputEncoding="utf-8", timeout=2):
    """get command output from terminal


    Args:
        consoleCommand (str): console/terminal command string
        consoleOutputEncoding (str): console output encoding, default is utf-8
        timeout (int): wait max timeout for run console command
    Returns:
        console output (str)
    Raises:
    """
    # print("getCommandOutput: consoleCommand=%s" % consoleCommand)
    isRunCmdOk = False
    consoleOutput = ""
    try:
        # consoleOutputByte = subprocess.check_output(consoleCommand)


        consoleOutputByte = subprocess.check_output(consoleCommand, shell=True, timeout=timeout)


        # commandPartList = consoleCommand.split(" ")
        # print("commandPartList=%s" % commandPartList)
        # consoleOutputByte = subprocess.check_output(commandPartList)
        # print("type(consoleOutputByte)=%s" % type(consoleOutputByte)) # <class 'bytes'>
        # print("consoleOutputByte=%s" % consoleOutputByte) # b'640x360\n'


        consoleOutput = consoleOutputByte.decode(consoleOutputEncoding) # '640x360\n'
        consoleOutput = consoleOutput.strip() # '640x360'
        isRunCmdOk = True
    except subprocess.CalledProcessError as callProcessErr:
        cmdErrStr = str(callProcessErr)
        print("Error %s for run command %s" % (cmdErrStr, consoleCommand))


    # print("isRunCmdOk=%s, consoleOutput=%s" % (isRunCmdOk, consoleOutput))
    return isRunCmdOk, consoleOutput

演示:

isRunOk, cmdOutputStr = getCommandOutput("mvn surefire:test", timeout=5)