def download(self, localfile: str, remotefile: str, overwrite: bool = True, **kwargs):
      """
      This method downloads a remote file from the SAS servers file system.
      localfile  - path to the local file to create or overwrite
      remotefile - path to remote file tp dpwnload
      overwrite  - overwrite the output file if it exists?
      """
      logf     = ''
      logn     = self._logcnt()
      logcodei = "%put E3969440A681A24088859985" + logn + ";"
      logcodeo = "\nE3969440A681A24088859985" + logn
      logcodeb = logcodeo.encode()

      valid = self._sb.file_info(remotefile, quiet = True)

      if valid is None:
         return {'Success' : False, 
                 'LOG'     : "File "+str(remotefile)+" does not exist."}

      if valid == {}:
         return {'Success' : False, 
                 'LOG'     : "File "+str(remotefile)+" is a directory."}

      if os.path.isdir(localfile):
         locf = localfile + os.sep + remotefile.rpartition(self._sb.hostsep)[2]
      else:
         locf = localfile

      try:
         fd = open(locf, 'wb')
         fd.write(b'write can fail even if open worked, as it turns out')
         fd.close()
         fd = open(locf, 'wb')
      except OSError as e:
         return {'Success' : False, 
                 'LOG'     : "File "+str(locf)+" could not be opened or written to. Error was: "+str(e)}

      code = "filename _sp_updn '"+remotefile+"' recfm=F encoding=binary lrecl=4096;"

      ll = self.submit(code, "text")
      logf  = ll['LOG']

      self.stdin[0].send(b'tom says EOL=DNLOAD                          \n')
      self.stdin[0].send(b'\n'+logcodei.encode()+b'\n'+b'tom says EOL='+logcodeb+b'\n')

      done  = False
      datar = b''
      bail  = False

      while not done:
         while True:
             if os.name == 'nt':
                try:
                   rc = self.pid.wait(0)
                   self.pid = None
                   self._sb.SASpid = None
                   return {'Success' : False, 
                           'LOG'     : "SAS process has terminated unexpectedly. RC from wait was: "+str(rc)}
                except:
                   pass
             else:
                rc = os.waitpid(self.pid, os.WNOHANG)
                if rc[1]:
                    self.pid = None
                    self._sb.SASpid = None
                    return {'Success' : False, 
                            'LOG'     : "SAS process has terminated unexpectedly. RC from wait was: "+str(rc)}

             if bail:
                if datar.count(logcodeb) >= 1:
                   break
             try:
                data = self.stdout[0].recv(4096)
             except (BlockingIOError):
                data = b''

             if len(data) > 0:
                datar += data
                if len(datar) > 8300:
                   fd.write(datar[:8192])
                   datar = datar[8192:]
             else:
                sleep(0.1)
                try:
                   log = self.stderr[0].recv(4096).decode(self.sascfg.encoding, errors='replace')
                except (BlockingIOError):
                   log = b''

                if len(log) > 0:
                   logf += log
                   if logf.count(logcodeo) >= 1:
                      bail = True
         done = True

      fd.write(datar.rpartition(logcodeb)[0])
      fd.flush()
      fd.close()

      self._log += logf
      final = logf.partition(logcodei)
      z = final[0].rpartition(chr(10))
      prev = '%08d' %  (self._log_cnt - 1)
      zz = z[0].rpartition("\nE3969440A681A24088859985" + prev +'\n')
      logd = zz[2].replace(";*\';*\";*/;", '')

      ll = self.submit("filename _sp_updn;", 'text')
      logd += ll['LOG']
      
      return {'Success' : True, 
              'LOG'     : logd}
def download ( self , localfile : str , remotefile : str , overwrite : bool = True , ** kwargs ) : logf = '' logn = self . _logcnt ( ) logcodei = "%put E3969440A681A24088859985" + logn + ";" logcodeo = "\nE3969440A681A24088859985" + logn logcodeb = logcodeo . encode ( ) valid = self . _sb . file_info ( remotefile , quiet = True ) if valid is None : return { 'Success' : False , 'LOG' : "File " + str ( remotefile ) + " does not exist." } if valid == { } : return { 'Success' : False , 'LOG' : "File " + str ( remotefile ) + " is a directory." } if os . path . isdir ( localfile ) : locf = localfile + os . sep + remotefile . rpartition ( self . _sb . hostsep ) [ 2 ] else : locf = localfile try : fd = open ( locf , 'wb' ) fd . write ( b'write can fail even if open worked, as it turns out' ) fd . close ( ) fd = open ( locf , 'wb' ) except OSError as e : return { 'Success' : False , 'LOG' : "File " + str ( locf ) + " could not be opened or written to. Error was: " + str ( e ) } code = "filename _sp_updn '" + remotefile + "' recfm=F encoding=binary lrecl=4096;" ll = self . submit ( code , "text" ) logf = ll [ 'LOG' ] self . stdin [ 0 ] . send ( b'tom says EOL=DNLOAD                          \n' ) self . stdin [ 0 ] . send ( b'\n' + logcodei . encode ( ) + b'\n' + b'tom says EOL=' + logcodeb + b'\n' ) done = False datar = b'' bail = False while not done : while True : if os . name == 'nt' : try : rc = self . pid . wait ( 0 ) self . pid = None self . _sb . SASpid = None return { 'Success' : False , 'LOG' : "SAS process has terminated unexpectedly. RC from wait was: " + str ( rc ) } except : pass else : rc = os . waitpid ( self . pid , os . WNOHANG ) if rc [ 1 ] : self . pid = None self . _sb . SASpid = None return { 'Success' : False , 'LOG' : "SAS process has terminated unexpectedly. RC from wait was: " + str ( rc ) } if bail : if datar . count ( logcodeb ) >= 1 : break try : data = self . stdout [ 0 ] . recv ( 4096 ) except ( BlockingIOError ) : data = b'' if len ( data ) > 0 : datar += data if len ( datar ) > 8300 : fd . write ( datar [ : 8192 ] ) datar = datar [ 8192 : ] else : sleep ( 0.1 ) try : log = self . stderr [ 0 ] . recv ( 4096 ) . decode ( self . sascfg . encoding , errors = 'replace' ) except ( BlockingIOError ) : log = b'' if len ( log ) > 0 : logf += log if logf . count ( logcodeo ) >= 1 : bail = True done = True fd . write ( datar . rpartition ( logcodeb ) [ 0 ] ) fd . flush ( ) fd . close ( ) self . _log += logf final = logf . partition ( logcodei ) z = final [ 0 ] . rpartition ( chr ( 10 ) ) prev = '%08d' % ( self . _log_cnt - 1 ) zz = z [ 0 ] . rpartition ( "\nE3969440A681A24088859985" + prev + '\n' ) logd = zz [ 2 ] . replace ( ";*\';*\";*/;" , '' ) ll = self . submit ( "filename _sp_updn;" , 'text' ) logd += ll [ 'LOG' ] return { 'Success' : True , 'LOG' : logd }
This method downloads a remote file from the SAS servers file system.
      localfile  - path to the local file to create or overwrite
      remotefile - path to remote file tp dpwnload
      overwrite  - overwrite the output file if it exists?