2013-03-02 6 views
7

많은 파일을 다운로드하고 그 사이에서 처리하는 FTP 연결이 있습니다. 내 FTP 연결이 시간 초과되지 않았는지 확인하고 싶습니다.Python FTP 연결 확인

conn = FTP(host='blah') 
conn.connect() 
for item in list_of_items: 
    myfile = open('filename', 'w') 
    conn.retrbinary('stuff", myfile) 
    ### do some parsing ### 

가 어떻게 그것이 ### do some parsing ### 라인 동안 제한 시간을 초과하는 경우 내 FTP 연결을 확인할 수 있습니다 그래서 코드는 어떤 모양?

답변

17

NOOP 명령을 보냅니다. 이것은 아무것도하지 않지만 연결이 계속되고 있는지 확인하고 주기적으로 연결하면 연결을 유지할 수 있습니다. 예를 들어

:

conn.voidcmd("NOOP") 

다음 FTP 객체가 예외가 발생합니다 연결에 문제가있는 경우. IO 오류

socket.error과 : 오류가있는 경우는 예외가 슬로우됩니다 documentation에서 볼 수 있습니다.이는 소켓 연결에 의해 제기와 관심있는 가능성이 가장 높은 것들된다

예외 ftplib.error_reply : 예기치 않은 응답이 서버에서 수신 된 경우 예외가 발생합니다.

예외 ftplib.error_temp : 임시 오류 (400-499 범위의 응답 코드)를 나타내는 오류 코드가 수신되면 예외가 발생합니다.

예외 ftplib.error_perm (500-599 범위에서 응답 코드) 영구 에러를 나타내는 에러 코드가 수신 될 때 발생 예외.

예외 ftplib.error_proto : 파일 전송 프로토콜의 응답 사양에 맞지 않는 서버로부터 응답을 받으면 예외가 발생합니다 (즉, 1-5 범위의 숫자로 시작).

따라서 try-catch block을 사용하여 오류를 감지하고 그에 따라 처리 할 수 ​​있습니다. 이 코드 샘플, IOError가 잡을 그것에 대해 당신에게 다음 작업을 다시 시도합니다 예를 들어

:

retry = True 
while (retry): 
    try: 
     conn = FTP('blah') 
     conn.connect() 
     for item in list_of_items: 
      myfile = open('filename', 'w') 
      conn.retrbinary('stuff', myfile) 
      ### do some parsing ### 

     retry = False 

    except IOError as e: 
     print "I/O error({0}): {1}".format(e.errno, e.strerror) 
     print "Retrying..." 
     retry = True 
+0

'할 수있는 하나 개의 확실한 방법이 있어야한다는 ftplib'는 파이썬 원리에 맞지 않는 것 같다 무언가 - 또는 적어도 당신은'voidcmd ('NOOP')' – Axeman