Message291275
I had some statements inside a `with` statement to write data to an entry in a
ZipFile. It worked great. I added a second `with` statement containing almost
exactly the same statements. That still worked great.
I refactored those common statements into a function and called that function
from the two `with` statements... and got an exception:
zlib.error: Error -2 while flushing: inconsistent stream state
I can't figure out why it matters whether the writing happens in the `with` or
in the function called by the `with`, but here's a trimmed-down version of the
code that demonstrates the problem:
--------------------------------------------------------------------------------
#!/usr/bin/env python
import io, pprint, zipfile
from zipfile import ZIP_DEFLATED
def printLiteral( data, out ) :
encoder = io.TextIOWrapper( out, encoding='utf-8', write_through=True )
pprint.pprint( data, stream=encoder )
data = { 'not' : 'much', 'just' : 'some K \N{RIGHTWARDS WHITE ARROW} V pairs' }
with zipfile.ZipFile( 'zzz.zip', mode='w', compression=ZIP_DEFLATED ) as myzip :
with myzip.open( 'this one works', 'w' ) as out :
encoder = io.TextIOWrapper( out, encoding='utf-8', write_through=True )
pprint.pprint( data, stream=encoder )
with myzip.open( 'this one fails', 'w' ) as out :
printLiteral( data, out )
print( 'printed but entry still open' )
print( 'entry has been closed but not file' )
print( 'zip file has been closed' )
--------------------------------------------------------------------------------
And here's the output on my Arch Linux 64bit with package `python 3.6.0-2`...
A co-worker sees the same behavior on MacOS 10.11.6 Python 3.6.1 :
--------------------------------------------------------------------------------
printed but entry still open
Traceback (most recent call last):
File "zzz.py", line 21, in <module>
print( 'printed but entry still open' )
File "/usr/lib/python3.6/zipfile.py", line 995, in close
buf = self._compressor.flush()
zlib.error: Error -2 while flushing: inconsistent stream state
--------------------------------------------------------------------------------
I tried debugging this in PyDev but got lost. Turning off the compression makes
the exception go away. |
|
Date |
User |
Action |
Args |
2017-04-07 14:21:06 | Jeremy Heiner | set | recipients:
+ Jeremy Heiner |
2017-04-07 14:21:06 | Jeremy Heiner | set | messageid: <1491574866.61.0.594608147469.issue30017@psf.upfronthosting.co.za> |
2017-04-07 14:21:06 | Jeremy Heiner | link | issue30017 messages |
2017-04-07 14:21:06 | Jeremy Heiner | create | |
|