我正在使用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个)',),)
这让我觉得paramiko在尝试发送(int,int)
时因为self
声明而无法识别回调。有办法解决这个问题吗?
答案 0 :(得分: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个参数:类(因为它是类方法))
通过classmethod:
log.info(self.sftp.put(payloadPath, '%s/%s' % (targetDir,payloadPath), callback=self.TransferStats))
编辑:您在以下行中遇到同样的问题:
self.TransferStats().counter=0
删除括号:
self.TransferStats.counter=0
此外,counter
上的TransferStats
属性是隐藏的全局,在每次Transmit
来电时都会重置。