'Call the binary with the given input.
:param input_str: A string whose contents are used as stdin.
:param binary: The location of the binary to call
:param args: A list of command-line arguments.
:return: stdout'

def _call(self, input_str, binary, args=[], verbose=False):

    if verbose:
        print(u'Calling:', binary)
        print(u'Args:', args)
        print(u'Input:', input_str)
        print(u'Command:', ((binary + u'    ') + u'    '.join(args)))
    if (input_str is None):
        cmd = ([binary] + args)
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    else:
        cmd = u'echo    "{0}"    |    {1}    {2}'.format(input_str, binary, u'    '.join(args))
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    (stdout, stderr) = p.communicate()
    if verbose:
        print(u'Return    code:', p.returncode)
        if stdout:
            print(u'stdout:\n', stdout, u'\n')
        if stderr:
            print(u'stderr:\n', stderr, u'\n')
    if (p.returncode != 0):
        raise Exception(u'ERROR    CALLING:    {0}    {1}\nReturncode:    {2}\n{3}'.format(binary, u'    '.join(args), p.returncode, stderr))
    return stdout
