【问题标题】:Python 2 and IPv6Python 2 和 IPv6
【发布时间】: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 将不可用。我错了吗?

标签: python ipv6


【解决方案1】:

好的,这是来自 cmets 的答案:

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

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

【讨论】:

  • 谢谢。我假设 socket.AF_INET6 的存在表明 IPv6 已启用。
  • 这对我来说非常有用并且很有效。但是... --enable-ipv6 选项记录在哪里?它根本不在README 中。
  • 对于像我这样在任何地方都没有看到--enable-ipv6 配置选项的人,请尝试使用./configure --help。它显示的配置选项比README 中显示的要多(我想这在事后看来有点道理?)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 2020-09-26
      • 2018-09-23
      • 2020-01-12
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      相关资源
      最近更新 更多