Ошибка с 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.

Другие вопросы по тегам