2015-10-06 68 views
2

我想下載java,因此我在shell中使用以下命令並且它可以正常工作。下載tar.gz的Python代碼給出UnicodeDecodeError

wget的-P /數據/ --no檢查證書--no餅乾--header 「曲奇:oraclelicense =接受-securebackup cookie的」 http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz

但是當我運行使用python相同的命令我收到一個錯誤。 這是我的python代碼。

from resource_management import * 

import os 
import params 
cmd = 'wget -P ' + params.java_tarball_path + ' --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz 
print cmd 
Execute(cmd, user=params.monarch_user, timeout=300) 

我得到以下錯誤 「文件 」/usr/lib/python2.6/site-packages/resource_management/core/shell.py「,線路198,在_call ERR_MSG = Logger.filter_text((」執行'%s'返回%d。%s「)%(command_alias,code,out)) UnicodeDecodeError:'ascii'編解碼器無法解碼位置1228中的字節0xe2:序號不在範圍內(128)」

我也打印了我的命令在python中執行,它對我來說看起來不錯。 「wget -P/data/--no-check-certificate --no-cookies -header」Cookie:oraclelicense = accept-securebackup -cookie「http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz

如何使用python的Execute命令下載?

+0

您已將問題標記爲「python-2.7」,但錯誤顯示爲「python-2.6」。另外,什麼是'resource_management'模塊? – ekhumoro

回答

0

我會用urllib2requests而不是使用Execute

import urllib2 
opener = urllib2.build_opener() 
opener.addheaders.append(('Cookie', 'oraclelicense=accept-securebackup-cookie')) 
f = opener.open('http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz') 
with open('jdk-7u79-linux-x64.tar.gz', 'w+') as save: 
    save.write(f.read()) 
+0

這對我有用。只是另一個問題,我想下載Java /工作位置,我該如何使用上述代碼? – user1393608

+0

執行該目錄中的代碼或將open()調整爲'/work/java.tar.gz'。你能將答案作爲「答案」嗎? – Noxeus

+0

Thanks @Ruben,It works – user1393608

0

stacktrace非常明確。對Logger.filter_text的呼叫產生了UnicodeError。這可能是因爲out是一個unicode。演示:

>>> "%s %s" % ("é", "é") # works 
'\xc3\xa9 \xc3\xa9' 
>>> "%s %s" % ("é", u"é") # doesn't work 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

您可能要修改resource_management /核心/ shell.py代碼和轉換out變量爲str:

Logger.filter_text(("Execution of '%s' returned %d. %s") % (command_alias, code, out.decode("utf-8"))) 
0

它看起來像在resource_management模塊,混合字節串中的錯誤和Unicode文本。要解決它,你可以自己下載壓縮包:

#!/usr/bin/env python2 
import os 
import urllib2 
from contextlib import closing 
from shutil import copyfileobj 

url = 'http://example.com/tarball.tar.gz' 
headers = {'Cookie': 'oraclelicense=accept-securebackup-cookie'} 
with closing(urllib2.urlopen(urllib2.Request(url, headers=headers))) as response, \ 
    open(os.path.join('/data', url.rsplit('/', 1)[-1]), 'wb') as output_file: 
    copyfileobj(response, output_file) 

的代碼不加載整個文件到內存中,因此它可以支持大文件。它不檢查Content-Length標題,即如果下載過早中斷,則可能會得到部分文件。