code: def walk_packages(path=None, prefix="", onerror=None):
      """Yields ModuleInfo for all modules recursively
      on path, or, if path is None, all accessible modules.
  
      'path' should be either None or a list of paths to look for
      modules in.
  
      'prefix' is a string to output on the front of every module name
      on output.
  
      Note that this function must import all *packages* (NOT all
      modules!) on the given path, in order to access the __path__
      attribute to find submodules.
  
      'onerror' is a function which gets called with one argument (the
      name of the package which was being imported) if any exception
      occurs while trying to import a package.  If no onerror function is
      supplied, ImportErrors are caught and ignored, while all other
      exceptions are propagated, terminating the search.
  
      Examples:
  
      # list all modules python can access
      walk_packages()
  
      # list all submodules of ctypes
      walk_packages(ctypes.__path__, ctypes.__name__+'.')
      """
  
      def seen(p, m={}):
          if p in m:
              return True
          m[p] = True
  
      for info in iter_modules(path, prefix):
          yield info
  
          if info.ispkg:
              try:
                  __import__(info.name)
              except ImportError:
                  if onerror is not None:
                      onerror(info.name)
              except Exception:
                  if onerror is not None:
                      onerror(info.name)
                  else:
                      raise
              else:
                  path = (
                      getattr(sys.modules[info.name], "__path__", None)
                      or []
                  )
  
                  # don't traverse path items we've seen before
                  path = [p for p in path if not seen(p)]
  
                  yield from walk_packages(
                      path, info.name + ".", onerror
                  )
  
imports: from collections import namedtuple
  from functools import singledispatch
  import importlib
  import importlib.util
  import importlib.machinery
  import os
  import os.path
  import sys
  from types import ModuleType
  import warnings
label_desc: Use image node_id 2 for calling a global function with example usage: walk_packages(path, prefix, onerror) and returns: True