Skip to main content
 首页 » 编程设计

Python base64.decode 似乎不适用于 Windows

2025年05月04日1498°冷暖

我正在使用一个 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。