def which(cmd, mode=os.F_OK | os.X_OK, path=None):
    """
    Given cmd, check where it is on PATH.

    Loosely based on the version in python 3.3.
    """

    if os.path.dirname(cmd):
        if os.path.isfile(cmd) and os.access(cmd, mode):
            return cmd

    if path is None:
        path = os.environ.get('PATH', defpath)
    if not path:
        return None

    paths = path.split(pathsep)

    if sys.platform == 'win32':
        # oh boy
        if curdir not in paths:
            paths = [curdir] + paths

        # also need to check the fileexts...
        pathext = os.environ.get('PATHEXT', '').split(pathsep)

        if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
            files = [cmd]
        else:
            files = [cmd + ext for ext in pathext]
    else:
        # sanity
        files = [cmd]

    seen = set()
    for p in paths:
        normpath = normcase(p)
        if normpath in seen:
            continue
        seen.add(normpath)
        for f in files:
            fn = os.path.join(p, f)
            if os.path.isfile(fn) and os.access(fn, mode):
                return fn

    return None
def which ( cmd , mode = os . F_OK | os . X_OK , path = None ) : if os . path . dirname ( cmd ) : if os . path . isfile ( cmd ) and os . access ( cmd , mode ) : return cmd if path is None : path = os . environ . get ( 'PATH' , defpath ) if not path : return None paths = path . split ( pathsep ) if sys . platform == 'win32' : if curdir not in paths : paths = [ curdir ] + paths pathext = os . environ . get ( 'PATHEXT' , '' ) . split ( pathsep ) if any ( cmd . lower ( ) . endswith ( ext . lower ( ) ) for ext in pathext ) : files = [ cmd ] else : files = [ cmd + ext for ext in pathext ] else : files = [ cmd ] seen = set ( ) for p in paths : normpath = normcase ( p ) if normpath in seen : continue seen . add ( normpath ) for f in files : fn = os . path . join ( p , f ) if os . path . isfile ( fn ) and os . access ( fn , mode ) : return fn return None
Given cmd, check where it is on PATH.

    Loosely based on the version in python 3.3.