code: def get_modules(root_path):
      
      for dir_path, dir_names, file_names in os.walk(root_path):
          assert dir_path[:len(root_path)] == root_path
          subdir_path = dir_path[len(root_path):]
          package_parts = list(filter(lambda x: x, subdir_path.split('/')))
          for name in file_names:
              if name.endswith('.py'):
                  path = os.path.join(dir_path, name)
                  pkgpath = '.'.join(package_parts)
                  modpath = (pkgpath if name == '__init__.py' else
                             '.'.join(package_parts + [name[:-3]]))
                  try:
                      node = ast.parse(open(path).read())
                  except SyntaxError:
                      print('ERROR: Invalid syntax in %s' % path, file=sys.stderr)
                  else:
                      yield (pkgpath, modpath, path, node)
docs: Gets (pkgpath, modpath, path, ast) for all modules in a file tree.