code: def run(
      self,
      show_plots=False,
      print_data=False,
      save_path="",
      return_df=False,
      **kwargs,
  ):
      has_single_bench = isinstance(self.benchmarks, Benchmark)
      benchmarks = (
          [self.benchmarks] if has_single_bench else self.benchmarks
      )
      result_dfs = []
      if save_path:
          # Create directory if it doesn't exist
          os.makedirs(save_path, exist_ok=True)
          html = open(os.path.join(save_path, "results.html"), "w")
          html.write("<html><body>\n")
      for bench in benchmarks:
          result_dfs.append(
              self._run(
                  bench, save_path, show_plots, print_data, **kwargs
              )
          )
          if save_path:
              html.write(f'<image src="{bench.plot_name}.png"/>\n')
      if save_path:
          html.write("</body></html>\n")
          html.close()
      if return_df:
          if has_single_bench:
              return result_dfs[0]
          else:
              return result_dfs
      return None
  
imports: import functools
  import os
  import subprocess
  import sys
  from contextlib import contextmanager
  from typing import Any, Dict, List
  from .None import language
label_desc: Use image node_id 3 for calling the Mark obj's underlying member method code with example usage: obj.run(show_plots, print_data, save_path, return_df) and returns: None, result_dfs, result_dfs