2015-10-06 67 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标题,即如果下载过早中断,则可能会得到部分文件。