code: def which(program, paths=None):
      
  
      def is_exe(fpath):
          return (os.path.exists(fpath) and
                  os.access(fpath, os.X_OK) and
                  os.path.isfile(os.path.realpath(fpath)))
  
      found_path = None
      fpath, fname = os.path.split(program)
  
      # if there's a path component, then we've specified a path to the program,
      # and we should just test if that program is executable.  if it is, return
      if fpath:
          program = os.path.abspath(os.path.expanduser(program))
          if is_exe(program):
              found_path = program
  
      # otherwise, we've just passed in the program name, and we need to search
      # the paths to find where it actually lives
      else:
          paths_to_search = []
  
          if isinstance(paths, (tuple, list)):
              paths_to_search.extend(paths)
          else:
              env_paths = os.environ.get("PATH", "").split(os.pathsep)
              paths_to_search.extend(env_paths)
  
          for path in paths_to_search:
              exe_file = os.path.join(path, program)
              if is_exe(exe_file):
                  found_path = exe_file
                  break
  
      return found_path
docs: takes a program name or full path, plus an optional collection of search
      paths, and returns the full path of the requested executable.  if paths is
      specified, it is the entire list of search paths, and the PATH env is not
      used at all.  otherwise, PATH env is used to look for the program