Python 2 和 IPv6

6 投票
3 回答
7340 浏览
提问于 2025-04-15 18:04

我正在尝试在一个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需要花费很多精力,我现在不想这么做。

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

具体情况是: Python 2.6.2 (r262:71600, 2009年10月24日,03:16:31) [GCC 4.4.1 [gcc-4_4-branch revision 150839]] 在linux2上运行 (这是标准的openSUSE 11.2安装中自带的Python)。

更新

在AndiDog的帮助下,我发现即使没有配置IPv6,socket.AF_INET6也是定义过的。然后我发现了socket.has_ipv6。这个是一个布尔值,表示Python是否是用IPv6构建的。

3 个回答

2

在我的Mac上(Mac OS X 10.5.8),2.6.4版本运行得很好。可惜的是,我不能降级到2.6.2版本,也没有openSUSE系统可以检查这个问题到底是从哪里来的。你能试试下载2.6.4版本并从源代码编译一下,看看问题是否解决,或者去查查openSUSE专用的bug跟踪器吗?至少我们知道这不是一个通用的Python 2.6的bug(至少在最新的、修复了bug的2.6版本中是这样)...

3

听起来你用的那个Python版本没有支持IPv6。

在这种情况下,你可以下载那个版本的源代码,然后自己编译一个支持IPv6的Python。你甚至可以尝试修改Debian的安装包,来升级系统里的Python。

4

好的,这里是评论中的回答:

看起来Python没有配置--enable-ipv6这个选项。

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

撰写回答