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