2010-11-26 3 views
1

urllib2를 열어 일부 웹 페이지를 다운로드하고 있습니다. 불행히도 한 페이지는 무한 스트림 (라이브 비디오 프레임 세트)이며 urllib2는 열린 호출이 성공하고 '읽기'호출이 영원히 멈추기 때문에 시간 초과되지 않습니다. 예제 코드 : 이러한 연결을 죽이는/피에urllib2를 사용하여 '무한'jpg를 여는 방법은 무엇입니까?

res = opener.open(encoded, timeout=timeout) 
log('opened', url) 
contents = res.read() 
log('never get here') 

모든 팁?

+0

당신이 원하는 답변을 찾을 때 도움이됩니다 –

답변

3

제이콥 (Jacob)이 언급 한 생성기 접근법을 사용하여 "킬 스위치 (kill switch)"를 통합했습니다.

startime = datetime.now() 
res = opener.open(url, timeout=timeout) 
contents = '' 
for item in res: 
    contents += item 
    if (datetime.now() - starttime).seconds > timeout: 
    raise IOError('timeout') 
2

멀티 파트인지 확인하기 위해 헤더를 검사 한 다음 내용을 삭제하거나 읽어야합니다.

0

작업에 대한 전체 시간 초과, 즉 언급 한 라인이 정의 된 기능을 넣을 수 있습니다.

3

이것은 발전기의 일처럼 들립니다.

무한한 텍스트 파일이 있다고 상상해보십시오 ... 이제 test.txt를 호출 할 수 있습니다. open('test.txt').read()은 컴퓨터를 멈추고 결국 충돌합니다. 이

out = open('out.txt') 
for line in yield_line('test.txt'): 
    out.write(line.replace('1','2')) 

는 이제 URL이 파일과 같은 방식으로 작동 할 수 있음을 고려해야 법적가되도록 초기화 yield_line가 반복 가능한 객체가됩니다 이제 때

def yield_line(file): 
    with open(file) as inp: 
     for line in inp: 
      yield line 

, 당신은 단지 라인을위한 라인을 얻을 수 URL

def yield_url(url): 
    with urllib.urlopen(url) as inp: 
     for line in inp: 
      yield line 

편집 : 시간 제한 예를

out = open('out.txt') 
for count, line in enumerate(yield_line('test.txt')): 
    if count == 444: #timeout value :D 
     break 
    out.write(line.replace('1','2')) 
+0

를 ^^ 동의하지만, 제 요점은 내가 무한 파일을 다운로드하지 않으려는 것이 었습니다 제발, 내가 같은 다운로드를 죽이고 싶어. 그러나 문제를 해결하기 위해 발전기 전략을 사용했습니다. – muckabout

+0

발전기는 실제로 놀랍습니다. 개인적으로 저는 파이썬의 모든 것이 발전기로 다시 쓰여질 수 있다고 믿습니다 ... –

관련 문제