Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 上载期间回调中的增量变量_Python_Python 2.7_Ftplib - Fatal编程技术网

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

我有以下用于上传的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()

如果希望
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)