5

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

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()
4

2 回答 2

13

如果你想让callback()函数改变全局变量intProgress,你必须global在函数中声明它......

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

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

于 2013-06-07T16:28:02.717 回答
3

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()
于 2013-06-07T16:45:47.383 回答