Python 2和IPv6

6

我正在尝试在Python 2应用程序中启用IPv6,但遇到了麻烦。每当我尝试绑定到IPv6套接字时,都会抛出一个“socket.error: getsockaddrarg: bad family”异常。我可以通过简单地执行以下操作来重现此错误:

import socket

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.bind(('', 12345))

如果我在Python 3中运行此代码,它可以正常工作。不幸的是,为了让脚本在Python 2中工作,需要进行相当大的移植工作,而我不想现在这样做。

我需要做些什么才能让IPv6在Python 2中工作,还是说我没戏了?

详细信息: Python 2.6.2(r262:71600,2009年10月24日,03:16:31) [Linux2上的GCC 4.4.1 [gcc-4_4-branch修订版150839]](它是标准openSUSE 11.2安装的Python)。

更新

在AndiDog帮助我弄清楚即使未配置IPv6,socket.AF_INET6也会被定义后,我发现 socket.has_ipv6 。这被定义为布尔值,并指示Python是否构建了IPv6。


1
Python 2.6.1在FreeBSD上运行没有问题。 - sberry
它能在相同的操作系统或其他操作系统上与Python 3一起使用吗? - AndiDog
看起来 socket.AF_INET6 总是可用的(如果在操作系统头文件中定义)。请查看 socketmodule.c,第 ~4433 行。 - AndiDog
顺便说一下,在Debian lenny上工作,Python 2.5.2。 - AndiDog
@Andidog - 哎呀!我的期望让我误入歧途。如果你把你的评论变成一个答案,我会接受它作为正确的答案。 - R Samuel Klatchko
显示剩余3条评论
3个回答

4

以下是来自评论的答案:

看起来 Python 没有使用 --enable-ipv6 进行配置。

这不应该是操作系统的问题,因为 Python 3 可以正常工作。即使操作系统不支持 IPv6,似乎 socket.AF_INET6 始终可用(如果在操作系统头文件中定义)。请参阅socketmodule.c,第4433行(当前 Python 2.6.4 源代码)。


谢谢。我假设socket.AF_INET6的存在表示启用了IPv6。 - R Samuel Klatchko
这非常有用,对我很有效。但是... --enable-ipv6 选项在哪里记录?它根本没有在 README 中。 - Russ
对于像我这样在任何地方都没有看到--enable-ipv6配置选项的人,请尝试执行./configure --help。它显示了比README中透露的更多的配置选项(我想这在事后看起来有些合理吧?)。 - Russ

3
听起来这个Python版本不支持IPv6。如果是这样,你可以下载该版本的源代码并构建一个兼容的Python。甚至你可以在Debian包中进行一些编辑并升级系统Python。

2

在我的 Mac 上(Mac OS X 10.5.8),2.6.4 版本运行良好 - 不幸的是我无法降级到 2.6.2,也没有 openSUSE 可以检查这个 bug 的具体来源。你能否尝试获取 2.6.4 并从源代码构建来查看是否可以解决该 bug,或者检查一些 openSUSE 特定的 bug 跟踪器...? 至少我们知道这不是通用的 Python 2.6 bug(至少最新的修复了 bug 的 2.6 版本不是)...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接