我有一个上传需要显示完成百分比的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()
答案 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()