Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 28, 2010 15:38:09

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

EOFError при pickle.loads

Получаю данные из сокета, анализирую пакет. Пакет, вроде как, приходит полностью.
Внутри пакета данные упакованы в pickle. Пытаюсь прочитать:

import cPickle as pickle
....
pickle.loads(data[startMsgPos:])
получаю ошибку:
Traceback (most recent call last):
File “./dsTest.py”, line 71, in _onPacket
pickle.loads(data)
EOFError
Eсли пробовать поточнее узнать, в чём ошибка:
        s = data[startMsgPos:]
try:
pickle.loads(s)
except pickle.UnpicklingError, e:
print 1
except EOFError, e:
print 2
except Exception, e:
print 3
выводит “2”.



Офлайн

#2 Июнь 28, 2010 16:59:07

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

EOFError при pickle.loads

решил проблему с помощью:

        s = s.replace( '\x00', '' )



Офлайн

#3 Июнь 28, 2010 18:14:17

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

EOFError при pickle.loads

имхо лучше найти причину появления нуля, вместо этой “затычки” бага

Офлайн

#4 Июль 6, 2010 15:39:13

axe
От:
Зарегистрирован: 2008-08-07
Сообщения: 256
Репутация: +  0  -
Профиль   Отправить e-mail  

EOFError при pickle.loads

Да, вы оказались совершенно правы. И бага оказалась довольно неприятной.

Из сокета данные приходили неполностью, т.е. внутри pickle иногда оказывался обрыв.
Но это случалось только в том случае, когда передаваемый пакет был слишком большим.

И лучше бы я занялся поиском этой проблемы сразу…



Офлайн

#5 Июль 6, 2010 15:55:42

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

EOFError при pickle.loads

пакеты при передаче могут как разрываться так и склеиваться, нужно это учитывать, либо воспользоваться каким-нибудь спец модулем

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version