我正在使用一个 web 服务(用 java 编写)——它基本上返回一个 byte[] 数组(SOAP 等价物是 base64 编码的二进制数据)。
我正在使用 python suds 库,以下代码适用于我的 mac(以及 windows 下的 cygwin),但解码不适用于 vanilla windows(python 2.6.5)。我主要是一名 Java 开发人员,所以任何帮助都会非常有帮助。
from suds.client import Client
import base64,os,shutil,tarfile,StringIO
u = "user"
p = "password"
url = "https://xxxx/?wsdl"
client = Client(url, username=u, password=p)
bin = client.service.getTargz("test")
f = open("tools.tar.gz", "w")
f.write(base64.b64decode(bin.encode('ASCII')))
f.close()
print "finished writing"
tarfile.open("tools.tar.gz").extractall()
在 Mac 上运行良好 - 但在 Windows 上出现此错误:
C:\client>python client.py
xml
Getting the sysprep file from the webservice
finished writing
Traceback (most recent call last):
File "client.py", line 28, in
tarfile.open("tools.tar.gz").extractall()
File "C:\Python26\lib\tarfile.py", line 1653, in open
return func(name, "r", fileobj, **kwargs)
File "C:\Python26\lib\tarfile.py", line 1720, in gzopen
**kwargs)
File "C:\Python26\lib\tarfile.py", line 1698, in taropen
return cls(name, mode, fileobj, **kwargs)
File "C:\Python26\lib\tarfile.py", line 1571, in __init__
self.firstmember = self.next()
File "C:\Python26\lib\tarfile.py", line 2317, in next
tarinfo = self.tarinfo.fromtarfile(self)
File "C:\Python26\lib\tarfile.py", line 1235, in fromtarfile
buf = tarfile.fileobj.read(BLOCKSIZE)
File "C:\Python26\lib\gzip.py", line 219, in read
self._read(readsize)
File "C:\Python26\lib\gzip.py", line 271, in _read
uncompress = self.decompress.decompress(buf)
zlib.error: Error -3 while decompressing: invalid distance too far back
请您参考如下方法:
尝试
f = open("tools.tar.gz", "wb")
告诉 Python 它是一个 binary 文件是至关重要的(在 Py3 中,它在 Unixy 系统上也变得至关重要,但在 Py2 中,它们并不是严格需要的,这就是为什么你的代码在 MacOSX 上工作的原因): 默认为文本,在 Windows 上,它在写入时将写入磁盘上的每个 \n 翻译成 \r\n。
