'Run graphviz \'dot\' over this graph, returning whatever \'dot\'
writes to stdout.
*args* will be passed along as commandline arguments.
*name* is the name of the graph
*urls* is a dictionary mapping class names to http urls
Raises DotException for any of the many os and
installation-related errors that may occur.'

def run_dot(self, args, name, parts=0, urls={}, graph_options={}, node_options={}, edge_options={}):

    try:
        dot = subprocess.Popen((['dot'] + list(args)), stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
    except OSError:
        raise DotException("Could    not    execute    'dot'.        Are    you    sure    you    have    'graphviz'    installed?")
    except ValueError:
        raise DotException("'dot'    called    with    invalid    arguments")
    except:
        raise DotException("Unexpected    error    calling    'dot'")
    self.generate_dot(dot.stdin, name, parts, urls, graph_options, node_options, edge_options)
    dot.stdin.close()
    result = dot.stdout.read()
    returncode = dot.wait()
    if (returncode != 0):
        raise DotException(("'dot'    returned    the    errorcode    %d" % returncode))
    return result
