[英]How can I specify a class method as a callback target in Python?
我正在使用paramiko的sftp模塊將有效負載傳輸到遠程主機。 sftp.put
調用的一部分允許使用簽名func(int,int)
指定回調方法。 我正在嘗試將傳輸統計信息方法放入Connection
類中,以跟蹤有效負載進度。
這是我目前的課程:
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()))
但是,當我嘗試此操作時,出現以下錯誤:
錯誤-(,TypeError('TransferStats()恰好接受3個參數(給定1個)',),)
這使我認為,由於self
聲明(int,int)
在嘗試發送回調(int,int)
時,paramiko不會識別該回調。 有沒有解決的辦法?
您的問題出在:
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
另外,您在TransferStats
上的counter
屬性是一個隱藏的全局變量,在每次Transmit
調用時都會重置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.