2016-08-12 26 views
0

我使用paramiko的sftp模塊將有效載荷傳輸到遠程主機。 sftp.put呼叫的一部分允許指定具有簽名func(int,int)的回叫方法。我試圖將轉移統計方法放入我的Connection類中,以跟蹤有效載荷進度。如何在Python中指定一個類方法作爲回調目標?

這裏的課堂上,我有當前:

class Connection: 

    def __init__(self, endpoint, RSAKeyObj): 
     self.displayHost = bcolors.OKGREEN + endpoint + bcolors.ENDC 
     self.transport = paramiko.Transport((endpoint,4022)) 
     self.transport.connect(username='transit', pkey=RSAKeyObj) 
     self.sftp = paramiko.SFTPClient.from_transport(self.transport) 

     try: 
      # initial sftp directory setup 
      log.info('[{0}]: Setting up remote directories...'.format(self.displayHost)) 
      log.info(self.sftp.mkdir(JAIL_DIR)) 
     except: 
      pass 

    def static_vars(**kwargs): 
     def decorate(func): 
      for k in kwargs: 
       setattr(func, k, kwargs[k]) 
      return func 
     return decorate 

    @static_vars(counter=0) 
    def TransferStats(self, transferedBytes, totalBytes): 
     if (transferedBytes/totalBytes) >= TransferStats.counter: 
      log.info('Transferred: {}% [{}/{}]'.format(round((transferedBytes/totalBytes)*100,2), transferedBytes, totalBytes)) 
      TransferStats.counter += 0.025 

    def Transmit(self,targetDir, payloadPath): 
     displayText = 'Transferring package {}...'.format(payloadPath) 
     self.TransferStats().counter=0 

     log.info('[%s] ' % self.displayHost + displayText) 
     log.info(self.sftp.put(payloadPath, '%s/%s' % (targetDir,payloadPath), callback=self.TransferStats())) 

然而,當我嘗試,我得到了以下錯誤:

ERROR - (, TypeError('TransferStats() takes exactly 3 arguments (1 given)',),)

這讓我覺得,回調是沒有得到認可由於self聲明,它試圖發送它的(int,int)時paramiko。有沒有解決的辦法?

+1

可能是你嘗試傳遞Connection.TransferStats而不是TransferStats() – Vasif

+1

另外,我有點不確定'self.TransferStats()。counter = 0'。 – Vasif

+0

'計數器'是一個全局隱藏的類方法的一個屬性,每調用一次'Transmit'被調用時,都會重新初始化爲0。我建議重構這段代碼,通過將其存儲在一個專用對象中(或者明確地說是全局的)來擺脫這個全局。 – pistache

回答

2

你的問題是:

log.info(self.sftp.put(payloadPath, '%s/%s' % (targetDir,payloadPath), callback=self.TransferStats())) 

你的錯誤:類(因爲它是一個類:

ERROR - (, TypeError('TransferStats() takes exactly 3 arguments (1 given)',),) 

通過調用TransferStats不帶參數(self.TransferStats()將導致1種說法引起方法))

只要通過類方法:

log.info(self.sftp.put(payloadPath, '%s/%s' % (targetDir,payloadPath), callback=self.TransferStats)) 

編輯:你有以下行同樣的問題:

self.TransferStats().counter=0 

刪除括號:

self.TransferStats.counter=0 

此外,在TransferStatscounter屬性是隱藏着一個全球性的,重置了在每個Transmit呼叫。

+1

我感覺一樣。 – Vasif

相關問題