code: def execution_request(self, products, subjects):
      
      roots = (tuple((s, p) for s in subjects for p in products))
      return self.execution_request_literal(roots)
docs: Create and return an ExecutionRequest for the given products and subjects.
  
      The resulting ExecutionRequest object will contain keys tied to this scheduler's product Graph,
      and so it will not be directly usable with other scheduler instances without being re-created.
  
      NB: This method does a "cross product", mapping all subjects to all products. To create a
      request for just the given list of subject -> product tuples, use `execution_request_literal()`!
  
      :param products: A list of product types to request for the roots.
      :type products: list of types
      :param subjects: A list of Spec and/or PathGlobs objects.
      :type subject: list of :class:`pants.base.specs.Spec`, `pants.build_graph.Address`, and/or
        :class:`pants.engine.fs.PathGlobs` objects.
      :returns: An ExecutionRequest for the given products and subjects.