2013-08-05 4 views
-1

나는 모든 FTP 서버로 설정된 여러 IP 주소로 파일을 푸시하는 간단한 스크립트를 만들기 위해 ftplib을 사용하고 있습니다. 파일 업로드 프로세스에서 진행 상황을 표시하고 싶었지만 문제가 있습니다. 내가 FTP.storbinary()의 콜백 인수를 사용하고 이런 식으로 작동합니다콜백에서 파이썬 FTP가 멈 춥니 다.

count = 0 
def update(block): 
    count2 = str(count + 1) 
    print count2 

그러나, 나는이 str() 전화의 외부의 연산을 수행하려고 할 경우, 프로그램이 중단됩니다. 그래서 다음은 작동하지 않습니다

count = 0 
def update(block): 
    count += 1 
    print count 

조차 작동하지 않는 str() 호출 count 포장. 첫 번째 전화가 걸리면됩니다.

답변

1

방금 ​​대신 FTP.storbinary에 전달하는, 자신을 update를 호출하려고하면 즉시 문제를 볼 수 있습니다 : 당신이 전역 변수를 업데이트하려면

>>> update('') 
UnboundLocalError: local variable 'count' referenced before assignment 

을 명시 적 세계를 표시해야 :

def update(block): 
    global count 
    count += 1 
    print count 

은 자세한 내용은 자주 묻는 질문 항목 Why am I getting an UnboundLocalError when the variable has a value? 다음과 같은 질문 What are the rules for local and global variables in Python?global의 문서를 참조하십시오.


클래스 작성하는 것이이 문제를 해결하기 위해 더 나은 방법 :

class FtpHandler(object): 
    def __init__(self): 
     self.count = 0 
    def update(self, block): 
     self.count += 1 
     print self.count 
다음

가, 그것을 사용하는, 당신은 클래스의 인스턴스를 구축, 그리고 일반 대신 바인딩 된 메서드를 통과 기능을 FTP 코드에 추가하십시오. 대신이의 예를 들면 다음과 같습니다

ftp = ftplib.FTP(...) 
# ... 
ftp.storbinary(spam, eggs, callback=update) 

은 ... 이렇게 :

myhandler = FtpHandler() 
ftp = ftplib.FTP(...) 
# ... 
ftp.storbinary(spam, eggs, callback=myhandler.update) 
+0

오 :

count = 0 def update(block): global count count += 1 print count 

이 나쁜 디자인의 표시가 귀하의 경우는 아마 속성을 가진 클래스를 사용하는 것이 좋을 것이다 거의 항상 네. 나는 그것에 대해 완전히 잊었다. 파이썬을 사용 했으니 까. 그리고 클래스가 더 좋을 것이라는 것에 동의 하겠지만, 간단한 일회용 유틸리티 였기 때문에 걱정하지 않았습니다. 나는 지금 무슨 일이 일어나고 있는지 파악하고 싶었다. – Jaws212

1

그냥 끊지 않습니다, 그것은 예외 (구체적으로 UnboundLocalError)를 생산하고 있습니다. 함수 내부에서 전역 변수를 수정하려고합니다. 이해야 할 변수는 global 선언해야합니다

class MyCallbackHandler(object): 
    def __init__(self): 
     self.count = 0 

    def update(self, block): 
     self.count += 1 
     #... etc.