HolyMackerel! उपकरण का प्रयोग करें!
import urllib2, sys, socket, time, os
def url_tester(url = "http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz"):
file_name = url.split('/')[-1]
u = urllib2.urlopen(url,None,1) # Note the timeout to urllib2...
file_size = int(u.info().getheaders("Content-Length")[0])
print ("\nDownloading: {} Bytes: {:,}".format(file_name, file_size))
with open(file_name, 'wb') as f:
file_size_dl = 0
block_sz = 1024*4
time_outs=0
while True:
try:
buffer = u.read(block_sz)
except socket.timeout:
if time_outs > 3: # file has not had activity in max seconds...
print "\n\n\nsorry -- try back later"
os.unlink(file_name)
raise
else: # start counting time outs...
print "\nHmmm... little issue... I'll wait a couple of seconds"
time.sleep(3)
time_outs+=1
continue
if not buffer: # end of the download
sys.stdout.write('\rDone!'+' '*len(status)+'\n\n')
sys.stdout.flush()
break
file_size_dl += len(buffer)
f.write(buffer)
status = '{:20,} Bytes [{:.2%}] received'.format(file_size_dl,
file_size_dl * 1.0/file_size)
sys.stdout.write('\r'+status)
sys.stdout.flush()
return file_name
यह अपेक्षित स्थिति को प्रिंट करता है। अगर मैं अपने ईथरनेट केबल अनप्लग, मैं मिलता है:
Downloading: Python-2.7.3.tgz Bytes: 14,135,620
827,392 Bytes [5.85%] received
sorry -- try back later
अगर मैं केबल अनप्लग, फिर इसे वापस कम से कम 12 सेकंड में प्लग में, मैं मिलता है:
Downloading: Python-2.7.3.tgz Bytes: 14,135,620
716,800 Bytes [5.07%] received
Hmmm... little issue... I'll wait a couple of seconds
Hmmm... little issue... I'll wait a couple of seconds
Done!
फ़ाइल सफलतापूर्वक डाउनलोड किया जाता है।
आप देख सकते हैं कि urllib2 दोनों टाइमआउट और पुन: कनेक्ट करने का समर्थन करता है। यदि आप डिस्कनेक्ट करते हैं और 3 * 4 सेकंड == 12 सेकेंड के लिए डिस्कनेक्ट रहते हैं, तो यह अच्छा होगा और घातक अपवाद बढ़ाएगा। यह भी साथ निपटा जा सकता है।
आप अपने रिपोर्ट में एक अपवाद उठा सकते हैं। – Tobold
हाँ, Google पर एक त्वरित रूप से, एक अपवाद उठाना डाउनलोड करना बंद करने का एक लोकप्रिय तरीका प्रतीत होता है। हालांकि दस्तावेज में इसका उल्लेख नहीं है, जो मुझे चिंता करता है कि यह अप्रत्याशित व्यवहार हो सकता है। उदाहरण के लिए, हो सकता है कि डेटा समर्पित थ्रेड द्वारा लाया जाता है, और अपवाद फेंकने से यह अनाथ बन जाएगा और वास्तव में डाउनलोड को रोक नहीं पाएगा। – Kevin