def executeCommand(args, failmsg=None, path=None):
    """
    Executes the given process and outputs failmsg when errors happen.
    Returns the combined shell output (stdout and strerr combined).

    :param args: 
    :type args: str or list
    :param failmsg: Message for exception when command fails
    :type failmsg: str
    :param path: Directory path where the command should be executed
    :type path: str
    :raise Exception: Raises an exception whenever the shell command fails in execution
    """

    if type(args) == str:
        args = shlex.split(args)

    prevpath = os.getcwd()

    # Execute in custom directory
    if path:
        path = os.path.abspath(os.path.expanduser(path))
        os.chdir(path)

    Console.debug("Executing command: %s", " ".join(args))
    Console.indent()
    
    # Using shell on Windows to resolve binaries like "git"
    output = tempfile.TemporaryFile(mode="w+t")
    returnValue = subprocess.call(args, stdout=output, stderr=output, shell=sys.platform == "win32")
        
    output.seek(0)
    result = output.read().strip("\n\r")
    output.close()

    # Change back to previous path
    os.chdir(prevpath)

    if returnValue != 0:
        raise Exception("Error during executing shell command: %s (%s)" % (failmsg, result))
    
    for line in result.splitlines():
        Console.debug(line)
    
    Console.outdent()
    
    return result
dataset/ETHPy150Open zynga/jasy/jasy/core/Util.py/executeCommand/original