Python 上载期间回调中的增量变量
我有以下用于上传的python脚本,需要显示完成百分比。我无法递增跟踪传输数据量的变量。 我得到一个Python 上载期间回调中的增量变量,python,python-2.7,ftplib,Python,Python 2.7,Ftplib,我有以下用于上传的python脚本,需要显示完成百分比。我无法递增跟踪传输数据量的变量。 我得到一个 UnboundLocalError:分配前引用的局部变量“intProgress” 错误。然而,如果我试图打印这个变量,它打印得很好,所以看起来它被引用了 import os, sys, ftplib pathname = 'C:/Paradigm1/1.PNG' intFileSize = os.path.getsize(pathname) intPercentDone = 0 intProg
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()
如果希望
callback()
函数更改全局变量intProgress
,则必须在函数中将其声明为global
def callback(p):
global intProgress
intProgress = intProgress + 1024
##sys.stdout.write(str(intProgress))
sys.stdout.write("-")
…否则,它将假定
intProgress
是一个局部变量,并且在设置它时试图引用它,这会让它感到困惑。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()
我对变量范围有点困惑,谢谢你的帮助!谢谢,这正是我要寻找的范例。我确实需要在report_progress()函数的开头添加一个“非本地”声明。具体来说,这就是“非本地总计”。@MatthewWalker:答案中的代码是针对Python 2的(请参见问题上的标签)。在Python 3上,您不需要列表破解,您可以使用
nonlocal total
,然后使用total=0
,以及total+=len(block)
。