在Python中如何将类方法指定为回调目标?

2024-09-24 06:20:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用paramiko的sftp模块将有效负载传输到远程主机。sftp.put调用的一部分允许使用签名func(int,int)指定回调方法。我试图将transfer stats方法放入我的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()))

但是,当我尝试此操作时,我得到以下错误:

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

这使我认为,由于self声明,当paramiko试图发送它的(int,int)时,它没有识别出回调。有办法吗?在


Tags: selfinfologparamikodefcounterendpointint
1条回答
网友
1楼 · 发布于 2024-09-24 06:20:58

你的问题在于:

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

您的错误:

^{pr2}$

是由不带参数调用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

另外,TransferStats上的counter属性是一个隐藏的全局变量,在每次调用Transmit时重置。在

相关问题 更多 >