Python sendto() не работает на 3.1 (работает на 2.6)

По некоторым причинам, следующее, кажется, прекрасно работает на моей машине с Ubuntu, работающей на Python 2.6, и возвращает ошибку на моем Windows XP Box с Python 3.1.

from socket import socket, AF_INET, SOCK_DGRAM
data = 'UDP Test Data'
port = 12345
hostname = '192.168.0.1'
udp = socket(AF_INET,SOCK_DGRAM)
udp.sendto(data, (hostname, port))

Ниже приведена ошибка, которую выдает Python 3.1:

Traceback (most recent call last):
  File "sendto.py", line 6, in <module>
    udp.sendto(data, (hostname, port))
TypeError: sendto() takes exactly 3 arguments (2 given)

Я ознакомился с документацией для python 3.1, и sendto() требует только два параметра. Любые идеи относительно того, что может быть причиной этого?

2 ответа

Решение

В Python 3 аргумент string (first) должен иметь тип байты или буфер, а не str. Вы получите это сообщение об ошибке, если укажите необязательный параметр flags. Изменить данные на:

data = b'UDP Test Data'

Возможно, вы захотите отправить отчет об ошибке на трекер ошибок python.org. [РЕДАКТИРОВАТЬ: уже подано, как отметил Дав]

...

>>> data = 'UDP Test Data'
>>> udp.sendto(data, (hostname, port))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sendto() takes exactly 3 arguments (2 given)
>>> udp.sendto(data, 0, (hostname, port))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sendto() argument 1 must be bytes or buffer, not str
>>> data = b'UDP Test Data'
>>> udp.sendto(data, 0, (hostname, port))
13
>>> udp.sendto(data, (hostname, port))
13

Связанная проблема с системой отслеживания ошибок Python: http://bugs.python.org/issue5421

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