-1

我正在使用ftplib创建一个简单的脚本来将文件推送到多个 IP 地址,所有 IP 地址都设置为 FTP 服务器。我想显示文件上传过程中的进度,但我遇到了问题。我使用的回调参数,FTP.storbinary()它适用于这样的事情:

count = 0
def update(block):
   count2 = str(count + 1)
   print count2

但是,如果我尝试在str()调用之外进行任何算术运算,程序就会挂起。所以以下不起作用:

count = 0
def update(block):
   count += 1
   print count

count即使在通话中包装str()也不起作用。它只是挂在第一个电话上。

4

2 回答 2

1

如果您只是尝试调用update自己,而不是将其传递给FTP.storbinary,您会立即看到问题:

>>> update('')
UnboundLocalError: local variable 'count' referenced before assignment

如果要更新全局变量,则必须显式将其标记为全局:

def update(block):
   global count
   count += 1
   print count

请参阅常见问题解答条目为什么当变量具有值时我会收到 UnboundLocalError?以及下面的问题Python 中局部变量和全局变量的规则是什么?,以及 上的文档global,了解更多详细信息。


解决这个问题的更好方法是编写一个类:

class FtpHandler(object):
    def __init__(self):
        self.count = 0
    def update(self, block):
        self.count += 1
        print self.count

然后,要使用它,您需要构造该类的实例,并将绑定方法而不是普通函数传递给 FTP 代码。例如,而不是这个:

ftp = ftplib.FTP(...)
# ...
ftp.storbinary(spam, eggs, callback=update)

… 做这个:

myhandler = FtpHandler()
ftp = ftplib.FTP(...)
# ...
ftp.storbinary(spam, eggs, callback=myhandler.update)
于 2013-08-05T22:34:34.943 回答
1

它不只是挂起,它会产生一个异常(特别是一个UnboundLocalError)。您正在尝试修改函数内部的全局变量;为此,必须声明变量global

count = 0
def update(block):
   global count
   count += 1
   print count

这几乎总是设计不良的标志,在您的情况下,使用具有属性的类可能会更好:

class MyCallbackHandler(object):
    def __init__(self):
        self.count = 0

    def update(self, block):
        self.count += 1
        #... etc.
于 2013-08-05T22:34:53.137 回答