Как использовать urllib2, чтобы открыть «бесконечный» JPG? - PullRequest
1 голос
/ 26 ноября 2010

Я использую urllib2 open для загрузки некоторых веб-страниц.К сожалению, одна страница представляет собой бесконечный поток (набор видеокадров в реальном времени), и urllib2 не будет иметь тайм-аут, потому что открытый вызов завершается успешно, в то время как вызов read читается вечно.Пример кода:

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

Любые советы, как избежать / убить эти соединения?

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Используя подход генератора, упомянутый Джейкобом, я включил «переключатель уничтожения».

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')
3 голосов
/ 26 ноября 2010

Звучит как работа для генераторов!

Представьте, что у вас есть бесконечный текстовый файл ... давайте теперь назовем его test.txt open('test.txt').read() приведет к зависанию машины и в конечном итоге к аварийному завершению, так почему бы не выдать строку за строкой в ​​этом бесконечном потоке в генераторе, например

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

теперь, когда инициализированный yield_line становится итеративным объектом, так что это становится допустимым

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

Теперь учтите, что URL-адрес может работать так же, как и файл, вы можете просто указать строку для строки в URL-адресе

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

Edit: Пример тайм-аута

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'))
2 голосов
/ 26 ноября 2010

Необходимо проверить заголовок, чтобы определить, является ли он составным, а затем отбросить или прочитать содержимое.

0 голосов
/ 26 ноября 2010

Вы можете установить тайм-аут на операцию в целом, т.е. на функцию, в которой определены упомянутые вами строки.

...