【发布时间】:2010-01-15 23:15:29
【问题描述】:
我正在尝试在 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 中工作还是我是 S-O-L?
详情: Python 2.6.2(r262:71600,2009 年 10 月 24 日,03:16:31) [GCC 4.4.1 [gcc-4_4-branch 修订版 150839]] 在 linux2 上 (Python 是标准 openSUSE 11.2 安装的一部分)。
更新
在 AndiDog 帮助我弄清楚即使未配置 IPv6 时也定义了 socket.AF_INET6 之后,我发现了socket.has_ipv6。这被定义为一个布尔值,并指示 Python 是否使用 IPv6 构建。
【问题讨论】:
-
Python 2.6.1 在 FreeBSD 上运行没有问题。
-
它是否可以在 非常相同 操作系统或其他操作系统上与 Python 3 一起使用?
-
@AndiDog - 是的,它适用于同一操作系统上的 Python 3。在单个 shell(如此相同的环境)中,如果我运行
python2 ./script我会得到异常,然后如果我运行python3 ./script我不会。 -
这很奇怪。似乎 Python 没有配置
--enable-ipv6。这不应该是操作系统问题,因为 Python 3 可以工作。 -
@Andidog - 我希望如果不使用 --enable-ipv6 ,符号 socket.AF_INET6 将不可用。我错了吗?