2010-01-15 38 views
4

我试图在Python 2应用程序中启用IPv6,并且遇到了麻烦。无论何时我尝试绑定到IPv6套接字,都会引发一个socket.error: getsockaddrarg: bad family异常。我可以简单地做重现错误:Python 2和IPv6

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日,3时16分31秒) [GCC 4.4.1 [GCC-4_4-分支修订150839]在linux2上 (这是Python的那标准openSUSE 11.2安装的一部分)。

更新

后AndiDog帮我弄清楚,socket.AF_INET6定义没有配置IPv6的即使,我发现socket.has_ipv6。这被定义为一个布尔值并指示Python是否使用IPv6构建。

+1

运行在FreeBSD上的Python 2.6.1没有问题。 – sberry 2010-01-15 23:19:29

+0

它可以在*非常相同的操作系统或另一个操作系统上使用Python 3吗? – AndiDog 2010-01-15 23:22:22

+0

@AndiDog - 是的,它可以在同一个操作系统上运行在Python 3上。在一个shell(如此相同的环境)中,如果我运行'python2。/ script',我得到异常,然后如果我运行'python3。/ script',我不会。 – 2010-01-15 23:26:37

回答

4

好这里是从评论的答案:

看起来像Python没有与--enable-ipv6配置。

它不应该是一个操作系统的问题,因为Python 3的作品。即使操作系统没有IPv6支持,看起来socket.AF_INET6总是可用的(如果它在OS头文件中定义的话)。参看socketmodule.c,第4433行(在当前的Python 2.6.4源代码中)。

+0

谢谢。我认为套接字的存在。AF_INET6表示已启用IPv6。 – 2010-01-16 00:11:35

+0

这是非常有用的,为我工作。但是......“--enable-ipv6”选项在哪里记录?它不在'README'中。 – Russ 2011-03-06 07:58:53

+0

对于像我这样没有在任何地方看到“--enable-ipv6”配置选项的人,尝试执行'./configure --help'。它显示的配置选项比'README'中显示的配置选项更多(我认为这在后见之明中有所帮助)。 – Russ 2011-03-06 08:10:49

2

在我的Mac(Mac OS X 10.5.8)上可以正常运行2.6.4 - 不幸的是我无法降级到2.6.2,我也没有任何openSUSE来检查错误是从哪里来的。你可以尝试2.6.4并从源代码构建来查看bug是否消失,或者查看一些openSUSE特定的bug跟踪器......?至少我们知道这不是一个通用的Python 2.6错误(至少具有最新的,固定版本的2.6版本)...

3

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

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