Выполнение процедуры urllib2 urlopen в Python 2.4

Я только что унаследовал код Python и исправил ошибку как можно скорее. У меня очень мало знаний Питона, поэтому, пожалуйста, извините мое невежество. Я использую urllib2 для извлечения данных с веб-страниц. Несмотря на использование socket.setdefaulttimeout(30) я все еще сталкиваюсь с URL-адресами, которые висят, казалось бы, бесконечно.

Я хочу отключить извлечение и получил это далеко после многого поиска в Интернете:

 import socket socket.setdefaulttimeout(30) reqdata = urllib2.Request(urltocollect) def handler(reqdata): ???? reqdata.close() ???? t = Timer(5.0, handler,[reqdata]) t.start() urldata = urllib2.urlopen(reqdata) t.cancel() 

Функция обработчика запускается после того, как прошло время, но я не знаю, как заставить его остановить работу openurl.

Любые указания будут с благодарностью получены. С

ОБНОВЛЕНИЕ ————————- По моему опыту, когда используется на определенных URL-адресах, urllib2.urlopen зависает и ждет бесконечно. URL-адреса, которые делают это, – это те, которые, когда указывается в браузере, никогда не разрешаются, браузер просто ждет, когда индикатор активности перемещается, но никогда не соединяется полностью. Я подозреваю, что эти URL-адреса могут зависеть от какой-то бесконечной циклической перенаправления. Аргумент таймаута для urlopen (в более поздних версиях Python) и глобального значения socket.setdefaulttimeout () не обнаруживает эту проблему в моей системе.

Я пробовал ряд решений, но в конце концов я обновился до Python 2.7 и использовал вариант ответа Вернера ниже. Спасибо, Вернер.

2 Solutions collect form web for “Выполнение процедуры urllib2 urlopen в Python 2.4”

Вы можете добиться этого с помощью сигналов.

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

Ps. не уверен, что это синтаксически правильно для 2.4. Я использую 2.6, но 2.4 поддерживает сигналы.

 import signal import time class TimeOutException(Exception): pass def timeout(seconds, *args, **kwargs): def fn(f): def wrapped_fn(*args, **kwargs): signal.signal(signal.SIGALRM, handler) signal.alarm(seconds) f(*args, **kwargs) return wrapped_fn return fn def handler(signum, frame): raise TimeOutException("Timeout") @timeout(5) def my_function_that_takes_long(time_to_sleep): time.sleep(time_to_sleep) if __name__ == '__main__': print 'Calling function that takes 2 seconds' try: my_function_that_takes_long(2) except TimeOutException: print 'Timed out' print 'Calling function that takes 10 seconds' try: my_function_that_takes_long(10) except TimeOutException: print 'Timed out' 

Это прямо в функции .

 urllib2.urlopen(url[, data][, timeout]) 

например:

 urllib2.urlopen("www.google.com", data, 5) 
  • Python формирует POST с использованием urllib2 (также вопрос о сохранении / использовании файлов cookie)
  • Почему python urllib2.urlopen () повышает HTTPError для успешных кодов состояния?
  • python, не получая полного ответа
  • Как открыть изображение из Интернета в PIL?
  • Мониторинг прогресса по протоколу urllib2
  • Проблема с большими запросами: GET не выпускает / не перезапускает TCP-соединения, сбои цикла
  • Использование urllib и BeautifulSoup для извлечения информации из Интернета с помощью Python
  • python получает заголовки только с помощью urllib2
  • Python - лучший язык программирования в мире.