Python中的sendto()在3.1上无效(在2.6中有效)
出于某种原因,在我的Ubuntu机器上运行Python 2.6时,下面的代码运行得很好,但在我的Windows XP机器上运行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 个回答
4
这是一个关于Python的相关问题,大家可以在这里查看详细信息:http://bugs.python.org/issue5421
6
在Python 3中,第一个参数必须是字节类型(bytes)或者缓冲区类型(buffer),而不能是字符串类型(str)。如果你提供了可选的标志参数,就会出现这个错误信息。你需要把数据改成:
data = b'UDP测试数据'
你可能想在python.org的错误跟踪系统上提交一个bug报告。 [编辑:已经有人提交了,正如Dav所提到的]
...
>>> 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