code: def runfile(filename, args=None, wdir=None, namespace=None, post_mortem=False):
      
      try:
          filename = filename.decode('utf-8')
      except (UnicodeError, TypeError, AttributeError):
          # UnicodeError, TypeError --> eventually raised in Python 2
          # AttributeError --> systematically raised in Python 3
          pass
      if __umr__.enabled:
          __umr__.run()
      if args is not None and not isinstance(args, basestring):
          raise TypeError("expected a character buffer object")
      if namespace is None:
          namespace = _get_globals()
      namespace['__file__'] = filename
      sys.argv = [filename]
      if args is not None:
          for arg in shlex.split(args):
              sys.argv.append(arg)
      if wdir is not None:
          try:
              wdir = wdir.decode('utf-8')
          except (UnicodeError, TypeError, AttributeError):
              # UnicodeError, TypeError --> eventually raised in Python 2
              # AttributeError --> systematically raised in Python 3
              pass
          os.chdir(wdir)
      if post_mortem:
          set_post_mortem()
      if __umr__.has_cython:
          # Cython files
          with io.open(filename, encoding='utf-8') as f:
              ipython_shell = get_ipython()
              ipython_shell.run_cell_magic('cython', '', f.read())
      else:
          execfile(filename, namespace)
  
      clear_post_mortem()
      sys.argv = ['']
  
      # Avoid error when running `%reset -f` programmatically
      # See issue spyder-ide/spyder-kernels#91
      try:
          namespace.pop('__file__')
      except KeyError:
          pass
docs: Run filename
      args: command line arguments (string)
      wdir: working directory
      post_mortem: boolean, whether to enter post-mortem mode on error