LINUX.ORG.RU

ошибка unpack python3

 


0

1

Имею класс для работы с rcon: https://github.com/barneygale/MCRcon/blob/master/mcrcon.py

при чтении пакета в 33й строке возникает ошибка:

# logging in...
Traceback (most recent call last):
  File "pymine.py", line 36, in connect_rcon
    rcon.login('***')
  File "/home/foozzi/pymine/src/mcrcon.py", line 56, in login
    return self.send(3, password)
  File "/home/foozzi/pymine/src/mcrcon.py", line 34, in send
    in_length, = struct.unpack('<i', self.socket.recv(4))
struct.error: unpack requires a string argument of length 4
Перервано (збережено знімок оперативної пам’яті)

Подскажите, как быть в таком случае, с пакетами на python пока не сильно работал

recv может вернуть пустую «строку» или «строку» меньшего размера, чем 4.

Никто мне не запретит тебе туда 2 байта послать.

anonymous
()
            in_length, = struct.unpack('<i', self.socket.recv(4))
            in_payload = self.socket.recv(in_length)
            in_id, in_type = struct.unpack('<ii', in_payload[:8])
            in_data_partial, in_padding = in_payload[8:-2], in_payload[-2:]

ваще странный код. ни одной проверки.

anonymous
()

Подскажите, как быть в таком случае, с пакетами на python пока не сильно работал

разобраться в проблеме и оформить pull request

создать issue

irr123
()
Ответ на: комментарий от irr123

В проект никто не коммитл. Так что именно PR. И если в течении месяца нет реакции попытаться на баланс взять.

deterok ★★★★★
()
Ответ на: комментарий от deterok

просто я под майн младшему милю прилу гуишную, все либы которые видел для python, абсолютно с таким кодом.
даже если загуглить «python mcrcon api»

noname_user ★★★
() автор топика
Ответ на: комментарий от noname_user

коллектор написать и парсить пакет, когда будет достаточный объем данных. Очевидно же (с)

anonymous
()
Ответ на: комментарий от anonymous

тут возможно я с тобой согласен, но повторюсь, не работал еще с такими вещами в python, был бы рад, если бы ты помог мне)

noname_user ★★★
() автор топика
Ответ на: комментарий от noname_user

А вообще ты уверен, что там не протухший вариант реализации протокола? а то как бе 2 года назад коммитили.

anonymous
()
Ответ на: комментарий от anonymous

Другие свежие, с такой же реализацией

noname_user ★★★
() автор топика
Ответ на: комментарий от noname_user

Можешь попробовать после установки соединения в методе connect написать что-то вроде:

self.socket.settimeout(1)

Тогда сокет станет блокирующим и будет пытаться получить нужное количество байт до истечения таймаута, а в случае неудачи выбросит исключение socket.timeout. Если не поможет, можно сделать таймаут побольше.

grazor ★★
()
Последнее исправление: grazor (всего исправлений: 1)
Ответ на: комментарий от grazor

либо так:

AttributeError: 'NoneType' object has no attribute 'settimeout'
либо та же ошибка... наверное все же нужно другую реализацию

noname_user ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.