code: def run_pipeline(
      source, options, full_module_name=None, context=None
  ):
      from . import Pipeline
  
      source_ext = os.path.splitext(source)[1]
      options.configure_language_defaults(source_ext[1:])  # py/pyx
      if context is None:
          context = options.create_context()
  
      # Set up source object
      cwd = os.getcwd()
      abs_path = os.path.abspath(source)
      full_module_name = (
          full_module_name
          or options.module_name
          or context.extract_module_name(source, options)
      )
  
      Utils.raise_error_if_module_name_forbidden(full_module_name)
  
      if options.relative_path_in_code_position_comments:
          rel_path = full_module_name.replace(".", os.sep) + source_ext
          if not abs_path.endswith(rel_path):
              rel_path = source  # safety measure to prevent printing incorrect paths
      else:
          rel_path = abs_path
      if Options.source_root:
          rel_path = os.path.relpath(abs_path, Options.source_root)
      source_desc = FileSourceDescriptor(abs_path, rel_path)
      source = CompilationSource(source_desc, full_module_name, cwd)
  
      # Set up result object
      result = create_default_resultobj(source, options)
  
      if options.annotate is None:
          # By default, decide based on whether an html file already exists.
          html_filename = os.path.splitext(result.c_file)[0] + ".html"
          if os.path.exists(html_filename):
              with io.open(
                  html_filename, "r", encoding="UTF-8"
              ) as html_file:
                  if "<!-- Generated by Cython" in html_file.read(100):
                      options.annotate = True
  
      # Get pipeline
      if source_ext.lower() == ".py" or not source_ext:
          pipeline = Pipeline.create_py_pipeline(
              context, options, result
          )
      else:
          pipeline = Pipeline.create_pyx_pipeline(
              context, options, result
          )
  
      context.setup_errors(options, result)
      err, enddata = Pipeline.run_pipeline(pipeline, source)
      context.teardown_errors(err, options, result)
      if err is None and options.depfile:
          from ..Build.Dependencies import create_dependency_tree
  
          dependencies = create_dependency_tree(
              context
          ).all_dependencies(result.main_source_file)
          Utils.write_depfile(
              result.c_file, result.main_source_file, dependencies
          )
      return result
  
imports: from __future__ import absolute_import
  import os
  import re
  import sys
  import io
  from .None import Errors
  from .StringEncoding import EncodedString
  from .Scanning import PyrexScanner, FileSourceDescriptor
  from .Errors import PyrexError, CompileError, error, warning
  from .Symtab import ModuleScope
  from ..None import Utils
  from .None import Options
  from .None import Version
label_desc: Use image node_id 3 for calling a global function with example usage: run_pipeline(source, options, full_module_name, context) and returns: result