docstr: Job wrapper give to resource manager to execute
  
  :param script: script file name
  :type script: str
  :param config: job configuration
  :type config: aup.BasicConfig
  :param path: working path
  :type path: str
  :param retries: max number of retries for one job in the case of job failure
  :type retries: int
code: def __init__(self, script, config, path=".", retries=3):
      """
      Job wrapper give to resource manager to execute
  
      :param script: script file name
      :type script: str
      :param config: job configuration
      :type config: aup.BasicConfig
      :param path: working path
      :type path: str
      :param retries: max number of retries for one job in the case of job failure
      :type retries: int
      """
      logger.debug("Input: %s,%s", script, path)
      self.config = config
      self.path = os.path.abspath(os.path.expanduser(path))
      if script[0] not in (".", "/"):
          script = os.path.join(".", script)
          if Job.local_warning:
              logger.warning(
                  "Using default local path for script as %s", script
              )
              Job.local_warning = False  # only warning once
      self.script = script
      self.jid = 0
      self.was_executed = False
      self.retries = retries
      self.curr_retries = 0
      self.rid_blacklist = set()
  
      # if true, it means this is the best job
      self.save_model_flag = config.get("save_model", False)
  
file_path: auptimizer/src/aup/EE/Job.py
imports: import logging
  import os
  import stat
  from time import sleep
  from ..utils import open_sftp_with_timeout
label_desc: Use image node_id 1 to create a new Job object  with example: obj = Job(script, config, path, retries)