HTTP

2011-08-09 13 views
5

मैं urllib2 का उपयोग करके फ़ाइलें के अतुल्यकालिक डाउनलोड करने के लिए कोशिश कर रहा हूँ के लिए urllib2.urlopen वापसी मान के लिए सॉकेट जाओ लेकिन कोई सॉकेट (या इसके fileno) जानने HTTP अनुरोधों के लिए के लिए नए डेटा के लिए प्रतीक्षा करने में सफल रहा है। यहां मैंने जो कोशिश की है वह यहां है।HTTP

>>> from urllib2 import urlopen 
>>> from select import select 
>>> r = urlopen('http://stackoverflow.com/') 
>>> select([r], [], []) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/socket.py", line 307, in fileno 
    return self._sock.fileno() 
AttributeError: HTTPResponse instance has no attribute 'fileno' 
>>> r.fileno() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/socket.py", line 307, in fileno 
    return self._sock.fileno() 
AttributeError: HTTPResponse instance has no attribute 'fileno' 
>>> r.fp.fileno() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/socket.py", line 307, in fileno 
    return self._sock.fileno() 
AttributeError: HTTPResponse instance has no attribute 'fileno' 
>>> select([r.fp], [], []) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/socket.py", line 307, in fileno 
    return self._sock.fileno() 
AttributeError: HTTPResponse instance has no attribute 'fileno' 
>>> 

उत्तर

2

http://www.velocityreviews.com/forums/t512553-re-urllib2-urlopen-broken.html देखें।

समस्या यह है कि urlib2 एक socket._fileobject में एक HttpResponse वस्तु रैप करने के लिए कुछ और फ़ाइल तरीकों प्राप्त करने के लिए बदल गया था है। सिवाय HttpResponse एक fileno() विधि नहीं है, इसलिए जब _fileobject इसका इस्तेमाल करने की कोशिश करता है ( ऊपर बताया के रूप में), यह चल रही है।

समाधान

HttpResponse के लिए एक उपयुक्त विधि जोड़ना:

def fileno(self): 
    return self.fp.fileno() 

या, वैकल्पिक रूप से, urllib.urlopen बजाय urrlib2.urlopen का उपयोग करें।

इस समस्या के लिए एक bug report नहीं है; यह पायथन 3 और पायथन 2.7 में तय किया गया था।

+0

धन्यवाद, महोदय! –

+0

यदि कोई पहले से नहीं है तो एक बग उठाया जाना चाहिए। –

+0

http://bugs.python.org/issue1327971। वास्तव में ऐसा लगता है कि आप ही इसने फिक्स किया है? – agf