我使用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。有沒有解決的辦法?
可能是你嘗試傳遞Connection.TransferStats而不是TransferStats() – Vasif
另外,我有點不確定'self.TransferStats()。counter = 0'。 – Vasif
'計數器'是一個全局隱藏的類方法的一個屬性,每調用一次'Transmit'被調用時,都會重新初始化爲0。我建議重構這段代碼,通過將其存儲在一個專用對象中(或者明確地說是全局的)來擺脫這個全局。 – pistache