2008-12-27 4 views
7

मेरे पास एक स्क्रिप्ट है जिसका उपयोग मैं जारी रखना जारी रखना चाहता हूं, लेकिन ऐसा लगता है कि मुझे या तो पाइथन 3 में एक बग के लिए कुछ कामकाज मिलना है, या वापस 2.6 पर डाउनग्रेड करना है, और इस प्रकार अन्य स्क्रिप्ट को डाउनग्रेड करना भी है ..पाइथन 3.0 में प्राधिकरण के साथ http पर एक फ़ाइल कैसे डाउनलोड करें, बग के आसपास काम कर रहे हैं?

उम्मीद है कि यहां कोई व्यक्ति पहले से ही एक कामकाज खोजने में कामयाब रहा है।

समस्या यह है कि पाइथन 3.0 में बाइट्स और तारों के संबंध में नए बदलावों के कारण, सभी पुस्तकालय कोड स्पष्ट रूप से परीक्षण नहीं किए जाते हैं।

मेरे पास एक स्क्रिप्ट है जो वेब सर्वर से एक पृष्ठ डाउनलोड करती है। इस स्क्रिप्ट ने पायथन 2.6 में यूआरएल के हिस्से के रूप में उपयोगकर्ता नाम और पासवर्ड पारित किया है, लेकिन पायथन 3.0 में, यह अब और काम नहीं करता है।

उदाहरण के लिए

, इस:

import urllib.request; 
url = "http://username:[email protected]/file"; 
urllib.request.urlretrieve(url, "temp.dat"); 

इस अपवाद के साथ विफल रहता है:

Traceback (most recent call last): 
    File "C:\Temp\test.py", line 5, in <module> 
    urllib.request.urlretrieve(url, "test.html"); 
    File "C:\Python30\lib\urllib\request.py", line 134, in urlretrieve 
    return _urlopener.retrieve(url, filename, reporthook, data) 
    File "C:\Python30\lib\urllib\request.py", line 1476, in retrieve 
    fp = self.open(url, data) 
    File "C:\Python30\lib\urllib\request.py", line 1444, in open 
    return getattr(self, name)(url) 
    File "C:\Python30\lib\urllib\request.py", line 1618, in open_http 
    return self._open_generic_http(http.client.HTTPConnection, url, data) 
    File "C:\Python30\lib\urllib\request.py", line 1576, in _open_generic_http 
    auth = base64.b64encode(user_passwd).strip() 
    File "C:\Python30\lib\base64.py", line 56, in b64encode 
    raise TypeError("expected bytes, not %s" % s.__class__.__name__) 
TypeError: expected bytes, not str 

जाहिर है, बेस 64 एन्कोडिंग अब बाइट में की जरूरत है और एक स्ट्रिंग आउटपुट, और इस तरह urlretrieve (या उसमें कुछ कोड) जो उपयोगकर्ता नाम की एक स्ट्रिंग बनाता है: पासवर्ड, और सरल प्रमाणीकरण के लिए बेस 64-एन्कोड करने की कोशिश करता है, विफल रहता है।

मैं बजाय, urlopen उपयोग करने के लिए इस तरह का प्रयास करें:

import urllib.request; 
url = "http://username:[email protected]/file"; 
f = urllib.request.urlopen(url); 
contents = f.read(); 
फिर

यह इस अपवाद के साथ विफल रहता है:

Traceback (most recent call last): 
    File "C:\Temp\test.py", line 5, in <module> 
    f = urllib.request.urlopen(url); 
    File "C:\Python30\lib\urllib\request.py", line 122, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python30\lib\urllib\request.py", line 359, in open 
    response = self._open(req, data) 
    File "C:\Python30\lib\urllib\request.py", line 377, in _open 
    '_open', req) 
    File "C:\Python30\lib\urllib\request.py", line 337, in _call_chain 
    result = func(*args) 
    File "C:\Python30\lib\urllib\request.py", line 1082, in http_open 
    return self.do_open(http.client.HTTPConnection, req) 
    File "C:\Python30\lib\urllib\request.py", line 1051, in do_open 
    h = http_class(host, timeout=req.timeout) # will parse host:port 
    File "C:\Python30\lib\http\client.py", line 620, in __init__ 
    self._set_hostport(host, port) 
    File "C:\Python30\lib\http\client.py", line 632, in _set_hostport 
    raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) 
http.client.InvalidURL: nonnumeric port: '[email protected]' 

जाहिर यूआरएल इस "अगले जनरल यूआरएल पुनर्प्राप्ति पुस्तकालय" में पार्स करने नहीं करता है यूआरएल में उपयोगकर्ता नाम और पासवर्ड के साथ क्या करना है पता नहीं है।

मेरे पास अन्य विकल्प क्या हैं?

उत्तर

20
Py3k डॉक्स से

प्रत्यक्ष: http://docs.python.org/dev/py3k/library/urllib.request.html#examples

import urllib.request 
# Create an OpenerDirector with support for Basic HTTP Authentication... 
auth_handler = urllib.request.HTTPBasicAuthHandler() 
auth_handler.add_password(realm='PDQ Application', 
          uri='https://mahler:8092/site-updates.py', 
          user='klem', 
          passwd='kadidd!ehopper') 
opener = urllib.request.build_opener(auth_handler) 
# ...and install it globally so it can be used with urlopen. 
urllib.request.install_opener(opener) 
urllib.request.urlopen('http://www.example.com/login.html') 
+0

क्या आप उस पासवर्ड को पोस्ट करना चाहते थे? यदि नहीं, तो मैं जवाब हटाने और वहां एक डमी डेटा के साथ एक नया पोस्ट करने का सुझाव देता हूं। हालांकि उत्तर के लिए धन्यवाद, यह आशाजनक लग रहा है। –

+3

पायथन डॉक्स से सीधे: पी –

+4

क्लेम शायद उसका असली पासवर्ड है अगर वह उसका असली पासवर्ड है :) –

0

मेरी सलाह अपने उत्पादन शाखा के रूप में अपने 2. * शाखा बनाए रखने के लिए जब तक आप 3.0 सामान हल कर प्राप्त कर सकते हैं होगा।

मैं पाइथन 3.0 पर जाने से पहले थोड़ी देर प्रतीक्षा करने जा रहा हूं। बहुत सारे लोग भीड़ में दिखते हैं, लेकिन मैं सिर्फ सब कुछ सुलझाता हूं, और तीसरे पक्ष के पुस्तकालयों का एक सभ्य चयन चाहता हूं। इसमें एक वर्ष लग सकता है, इसमें 18 महीने लग सकते हैं, लेकिन "अपग्रेड" का दबाव वास्तव में मेरे लिए कम है।

संबंधित मुद्दे