2013-06-07 3 views
3

% 완료를 표시해야하는 업로드를 위해 다음과 같은 python 스크립트가 있습니다. 전송되는 데이터의 양을 추적하는 변수를 증가시키는 데 문제가 있습니다.
UnboundLocalError : 할당 전에 로컬 변수 'intProgress'가 참조되었습니다.
오류가 발생했습니다. 그러나이 변수를 인쇄하려고하면 잘 인쇄되므로 참조되는 것처럼 보입니다. 당신이 callback() 기능은 전역 변수 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() 

답변

8

, 당신은 그렇지 않으면 intProgress입니다 가정합니다 ... ... 기능에 global로 선언하는

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

이 로컬 변수를 사용하고, 설정시이를 참조하려고한다는 사실에 혼란 스러울 수 있습니다.

+0

는 내가 어렸을 도움의 변수 범위 덕분에 대해 자신을 혼동! – HelloW

2

intProgress = 내부 함수는 파이썬이 변수를 외부 범위에서 변수를 가리키는 로컬 변수로 취급하도록합니다. 가변 전역을 방지하기 위해

, 당신은 폐쇄를 만들 수 있습니다

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