代码之家  ›  专栏  ›  技术社区  ›  R Samuel Klatchko

python 2和ipv6

  •  6
  • R Samuel Klatchko  · 技术社区  · 15 年前

    我试图在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中运行,这个代码就可以正常工作。不幸的是,该脚本需要大量的移植工作才能在Python3中工作,我宁愿现在不必这样做。

    在python 2中,我需要做些什么来让ipv6工作,还是我是s-o-l?

    细节: python 2.6.2(r262:71600,2009年10月24日,03:16:31) [GCC 4.4.1[GCC-4_4-Branch Revision 150839]关于Linux2 (这是标准OpenSUSE11.2安装中的python)。

    更新

    在andidog帮助我发现socket.af_ent6是定义的,即使没有配置ipv6,我发现 socket.has_ipv6 . 这被定义为一个布尔值,并指示python是否是用ipv6构建的。

    3 回复  |  直到 15 年前
        1
  •  4
  •   AndiDog    15 年前

    好的,下面是评论的答案:

    好像python没有配置 --enable-ipv6 .

    这不应该是一个操作系统问题,因为python 3可以工作。即使操作系统不支持IPv6,看起来 socket.AF_INET6 始终可用(如果在OS头文件中定义)。囊性纤维变性。 插座模块 ,第4433行(在当前的python 2.6.4源代码中)。

        2
  •  3
  •   Andrew McGregor    15 年前

    听起来,特定的python不是用ipv6支持编译的。

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

        3
  •  2
  •   Alex Martelli    15 年前

    在我的Mac(Mac OS X 10.5.8)上使用2.6.4很好——不幸的是,我不能降级到2.6.2,也没有任何OpenSUSE来检查漏洞的具体来源。您可以尝试从源代码获取2.6.4并进行构建以查看bug是否消失,或者检查一些OpenSUSE特定的bug跟踪器…?至少我们知道这不是一个通用的python 2.6 bug(至少是2.6最新的bug修复版本)。