code: def _run_step(step_obj, step_declaration, initialized_resources):
      
  
      start_time = time.time()
  
      # Open any resources that need to be opened before we run this step
      for res_name in step_declaration.resources.opened:
          initialized_resources[res_name].open()
  
      # Create a dictionary of all of the resources that are required for this step
      used_resources = {local_name: initialized_resources[global_name] for local_name, global_name in step_declaration.resources.used.items()}
  
      # Allow steps with no resources to not need a resources keyword parameter
      if len(used_resources) > 0:
          out = step_obj.run(resources=used_resources)
      else:
          out = step_obj.run()
  
      # Close any resources that need to be closed before we run this step
      for res_name in step_declaration.resources.closed:
          initialized_resources[res_name].close()
  
      end_time = time.time()
  
      return (end_time - start_time, out)
docs: Actually run a step.