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 3 中工作,我宁愿不必这样做。

我需要做些什么才能让 IPv6 在 Python 2 中工作还是我是 SOL?

详细信息:Linux2 上的 Python 2.6.2 (r262:71600, Oct 24 2009, 03:16:31) [GCC 4.4.1 [gcc-4_4-branch revision 150839]](它是标准 openSUSE 11.2 安装的一部分的 Python )。

更新

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

4

3 回答 3

4

好的,这是评论中的答案:

似乎 Python 没有配置--enable-ipv6.

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

于 2010-01-16T00:05:50.627 回答
3

听起来那个特定的 Python 没有在编译时支持 IPv6。

在这种情况下,您可以下载该版本的源代码并为自己构建一个兼容的 Python。您甚至可以在 Debian 软件包中进行一些编辑并升级系统 python。

于 2010-01-15T23:48:00.297 回答
2

在我的 Mac (Mac OS X 10.5.8) 上使用 2.6.4 可以正常工作——不幸的是,我无法降级到 2.6.2,也没有任何 openSUSE 可以检查错误具体来自您的位置。您能否尝试获取 2.6.4 并从源代码构建以查看错误是否消失,或者检查一些特定于 openSUSE 的错误跟踪器...?至少我们知道它不是一个通用的 Python 2.6 错误(至少是最新的、修复错误的 2.6 版本)......

于 2010-01-15T23:29:39.520 回答