2013-09-24 4 views
0

ISP가 하루에 한 번씩 연결을 끊습니다. 다운로드 도중 발생하면 예외는 전혀 throw되지 않고 다운로드가 잠시 중지됩니다.ISP가 24 시간 끊어지면 영원히 다운로드가 중단됩니다

지금 당장 다운로드를 스레딩 한 다음 최대 시간을 확인하거나 파일 크기의 전자 메일을 읽은 다음 계속 증가하는지 확인할 수 있습니다. 내가 지금 사용하고

기능 :

def download_with_progress(url,localFileName,overwrite=False): 
    if not os.path.exists(localFileName) or overwrite == True: 
     urlretrieve(url, localFileName, reporthook=print_progress) 
     sys.stdout.write("\r") #remove previously printed percent sign 
     sys.stdout.flush() 

def print_progress(count, blockSize, totalSize): 
    total_MB = (totalSize)/(1000 * 1000) 
    current_MB = (blockSize * count)/(1000 * 1000) 
    percent = int(count*blockSize*100/totalSize)   
    sys.stdout.write("\r%d%% (%d/%d MB)" % (percent, current_MB, total_MB)) 
    sys.stdout.flush() 

나는 이미 여기있어 이후로는 : total_MB 또는 current_MB 제대로 그런 식으로 계산된다? 또는 1024 * 1024으로 나눠야합니까? 나는 그것들을 반올림 된 int로 표시하고 있으므로, 실제로 문제는 아닙니다.

+0

게시물의 제목은 함께 할 수 없다 당신이 묻고있는 질문. 해결하고자하는 실제 문제는 무엇입니까? –

+0

내 다운로드 기능은 정상적으로 작동하지만 인터넷 연결이 끊어진 경우 (5 초 동안) 다운로드가 영구적으로 멈 춥니 다. 그것은 무엇이든 예외를 던지지 않고 간단히 정지시킵니다. – Wurstbro

답변

2

urllib2 대신에 requests library; ISP 연결 해제를 감지하도록 TCP Keep-Alive option을 설정합니다.

추가 소켓 옵션을 설정해야 할 수도 있습니다. urllib3 라이브러리는 소켓이 여전히 사용할 수있는 경우 감지 select를 사용하고, 시간 제한을 설정하지만 소켓에 명시 적 KEEPALIVE 옵션을 추가하면 감지에게 아직도 조금 부드러운을해야합니다

import httplib 
import socket 

orig_connect = httplib.HTTPConnection.connect 
def new_connect(self): 
    orig_connect(self) 
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 
httplib.HTTPConnection.connect = new_connect 
+0

멋지게 보일 것입니다. – Wurstbro

+0

요청을 설치/복사하는 방법을 말해 줄 수 있습니까? 하나의 폴더에 프로그램을 함께 제공 할 수 있습니까? – Wurstbro

+0

스크립트와 동일한 폴더에 있으면 직접 사용할 수 있어야합니다. 별도의'packages' 서브 디렉토리를 추가하고 그 디렉토리를'sys.path'에 추가 할 수도 있습니다. 'requests'는'packages' 하위 패키지를 사용하고'requests.packages. '에서 의존성을 가져옵니다. –