我试图在Python2应用程序中启用IPv6,但遇到了问题。每当我尝试绑定到IPv6套接字时,都会引发socket.error: getsockaddrarg: bad family
异常。我可以简单地复制错误:
import socket
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.bind(('', 12345))
如果我在Python 3中运行,那么这段代码可以正常工作。不幸的是,要在Python 3中工作,脚本需要大量的移植工作,我宁愿现在还不这样做。
为了让IPv6在Python 2中工作,我需要做些什么吗?或者我是S-O-L?
详细信息: Python2.6.2(r262:71600,2009年10月24日,03:16:31) 关于linux2的[GCC 4.4.1[GCC-4 U 4-分支版本150839]] (这是标准openSUSE 11.2安装中的Python)。
更新
在AndiDog帮助我弄清楚socket.AF_INET6是在没有配置IPv6的情况下定义的之后,我发现了socket.has_ipv6
。这被定义为布尔值,并指示Python是否是使用IPv6构建的。
好的,下面是评论的答案:
似乎Python没有配置
--enable-ipv6
。这不应该是操作系统的问题,因为Python 3可以工作。即使操作系统不支持IPv6,似乎
socket.AF_INET6
总是可用的(如果它是在操作系统头文件中定义的)。Cf.socketmodule.c,第4433行(在当前的Python 2.6.4源代码中)。在我的Mac(Mac OS X 10.5.8)上使用2.6.4很好——不幸的是,我不能降级到2.6.2,也没有任何openSUSE来检查这个bug是从哪里来的。你能试着从源代码中获取2.6.4并构建来查看bug是否消失,或者检查一些openSUSE特有的bug跟踪器。。。?至少我们知道它不是一个通用的Python2.6 bug(至少是最新的,bug修复版的2.6)。。。
听起来好像那个特定的Python不是用IPv6支持编译的。
在这种情况下,您可以下载该版本的源代码,并为自己构建一个可以工作的兼容Python。您甚至可以在Debian包中进行一些编辑并升级系统python。
相关问题 更多 >
编程相关推荐