Ошибка с PyPy + gzip?
Очень простой случай:
import gzip
import cStringIO
s = 's' * 1000
buf = cStringIO.StringIO()
gzip.GzipFile(fileobj=buf, mode='wb').write(s)
buf.tell()
Под Python 2.7, buf.tell()
возвращается 29
и содержимое буфера может быть разархивировано, чтобы восстановить исходную строку.
Под PyPy 5.8.0, buf.tell()
возвращается 10
и содержимое повреждено и не может быть распаковано.
Это также верно при использовании StringIO
модуль вместо cStringIO
,
Есть идеи?
1 ответ
Как сказал Кичик, вам нужно закрыть файл. В PyPy файлы закрываются не так быстро, как в CPython. Для доказательства, следующий код также печатает 10
на CPython:
import gzip
import cStringIO
s = 's' * 1000
buf = cStringIO.StringIO()
f = gzip.GzipFile(fileobj=buf, mode='wb')
f.write(s)
print buf.tell()
Разница с вашим кодом заключается только в том, что объект GzipFile хранится в переменной f
, который еще жив, когда buf.tell()
называется; он ожидает получения дополнительных данных, прежде чем завершит запись данных gz в buf
файл. Правильное исправление - закрыть файл, либо f.close()
или with
заявление. Это упоминается в первом абзаце этого раздела на странице различий CPython.