上传期间回调中的增量变量

时间:2013-06-07 16:21:39

标签: python python-2.7 ftplib

我有一个上传需要显示完成百分比的python脚本。我无法增加跟踪传输数据量的变量。 我得到了一个 UnboundLocalError:赋值前引用的局部变量'intProgress'
错误。然而,如果我尝试打印这个变量,它打印得很好,所以它似乎被引用。

import os, sys, ftplib
pathname = 'C:/Paradigm1/1.PNG'
intFileSize = os.path.getsize(pathname)
intPercentDone = 0
intProgress = 0

def callback(p):
    intProgress = intProgress + 1024
    ##sys.stdout.write(str(intProgress))
    sys.stdout.write("-")
session = ftplib.FTP('Server','UserName','Password')
f = open(pathname,'rb')# file to send
session.storbinary('STOR /Ftp Accounts/PublicDownloads/test.png', f, 1024, callback)
f.close()

2 个答案:

答案 0 :(得分:10)

如果您希望callback()函数更改全局变量intProgress,则必须在函数中将其声明为global ...

def callback(p):
    global intProgress
    intProgress = intProgress + 1024
    ##sys.stdout.write(str(intProgress))
    sys.stdout.write("-")

...否则它会假设intProgress是一个局部变量,并且在设置它时会尝试引用它而感到困惑。

答案 1 :(得分:2)

函数内部的

intProgress =迫使Python将其视为局部变量,从外部范围掩盖变量。

为了避免可变的全局变量,你可以创建一个闭包:

import os
import sys

def make_callback(filesize):
    total = [0] # use list to emulate nonlocal keyword
    width = len(str(filesize))

    def report_progress(block):
        total[0] += len(block)
        sys.stderr.write("\r{:{}d} / {}".format(total[0], width, filesize))

    return report_progress

def main():
    # ...
    ftp.storbinary(..., make_callback(os.path.getsize(filename)))

main()