code: def run_setup(script_name, script_args=None, stop_after="run"):
      """Run a setup script in a somewhat controlled environment, and
      return the Distribution instance that drives things.  This is useful
      if you need to find out the distribution meta-data (passed as
      keyword args from 'script' to 'setup()', or the contents of the
      config files or command-line.
  
      'script_name' is a file that will be read and run with 'exec()';
      'sys.argv[0]' will be replaced with 'script' for the duration of the
      call.  'script_args' is a list of strings; if supplied,
      'sys.argv[1:]' will be replaced by 'script_args' for the duration of
      the call.
  
      'stop_after' tells 'setup()' when to stop processing; possible
      values:
        init
          stop after the Distribution instance has been created and
          populated with the keyword arguments to 'setup()'
        config
          stop after config files have been parsed (and their data
          stored in the Distribution instance)
        commandline
          stop after the command-line ('sys.argv[1:]' or 'script_args')
          have been parsed (and the data stored in the Distribution)
        run [default]
          stop after all commands have been run (the same as if 'setup()'
          had been called in the usual way
  
      Returns the Distribution instance, which provides all information
      used to drive the Distutils.
      """
      if stop_after not in ("init", "config", "commandline", "run"):
          raise ValueError(
              "invalid value for 'stop_after': %r" % (stop_after,)
          )
  
      global _setup_stop_after, _setup_distribution
      _setup_stop_after = stop_after
  
      save_argv = sys.argv.copy()
      g = {"__file__": script_name}
      try:
          try:
              sys.argv[0] = script_name
              if script_args is not None:
                  sys.argv[1:] = script_args
              with open(script_name, "rb") as f:
                  exec(f.read(), g)
          finally:
              sys.argv = save_argv
              _setup_stop_after = None
      except SystemExit:
          # Hmm, should we do something if exiting with a non-zero code
          # (ie. error)?
          pass
  
      if _setup_distribution is None:
          raise RuntimeError(
              (
                  "'distutils.core.setup()' was never called -- "
                  "perhaps '%s' is not a Distutils setup script?"
              )
              % script_name
          )
  
      # I wonder if the setup script's namespace -- g and l -- would be of
      # any interest to callers?
      # print "_setup_distribution:", _setup_distribution
      return _setup_distribution
  
file_path: catboost/contrib/tools/python3/src/Lib/distutils/core.py
imports: import os
  import sys
  from distutils.debug import DEBUG
  from distutils.errors import *
  from distutils.dist import Distribution
  from distutils.cmd import Command
  from distutils.config import PyPIRCCommand
  from distutils.extension import Extension
label_desc: Use image node_id 3 for calling a global function with example usage: run_setup(script_name, script_args, stop_after) and returns: _setup_distribution