簡體   English   中英

如何在Python中將類方法指定為回調目標?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM