【问题标题】:python 3: ipaddr/netaddr modulespython 3:ipaddr/netaddr 模块
【发布时间】:2011-02-12 11:36:52
【问题描述】:

我必须在这里做错了...我目前正在尝试使用内置模块验证 ip 是否在特定子网内。

我正在使用activepython:

ActivePython 3.1.2.3 (ActiveState Software Inc.) 基于 Python 3.1.2 (r312:79147, Mar 22 2010, 12:20:29) [MSC v.1500 32 bit (Intel)] on win32

在更新日志中有这个:

蟒蛇新闻 (编辑:查看 NEWS.help 以获取有关使用 ReST 编辑 NEWS 的信息。) Python 3.1.2 有什么新功能? 发布日期:2010-03-20 ----- 剪断 ----- 删除了 ipaddr 模块。 问题 #3613:base64.{encode,decode}string 现在被调用 系统消息:WARNING/2(,第 706 行) ----- 剪断 ----- 问题 #3959:ipaddr 模块已添加到标准库中。由谷歌提供。

那个和其他谷歌搜索让我相信 ipaddr 是一个内置的,然而:

>>> 导入ipaddr 回溯(最近一次通话最后): 文件“”,第 1 行,在 ImportError:没有名为 ipaddr 的模块 >>> 从 ipaddr 导入 * 回溯(最近一次通话最后): 文件“”,第 1 行,在 ImportError:没有名为 ipaddr 的模块

所以我想我会安装 netaddr 并尝试使用它,而我从 netaddr 得到的只是:

>>> 导入网络地址 回溯(最近一次通话最后): 文件“”,第 1 行,在 文件“C:\Python31\lib\site-packages\netaddr\__init__.py”,第 18 行,在 从 netaddr.ip 导入 IPAddress、IPNetwork、IPRange、all_matching_cidrs、\ 文件“C:\Python31\lib\site-packages\netaddr\ip\__init__.py”,第 1877 行,在 IPV6_LOOPBACK = IPAddress('::1') 文件“C:\Python31\lib\site-packages\netaddr\ip\__init__.py”,第 262 行,在 __init__ 自我价值=地址 _set_value 中的文件“C:\Python31\lib\site-packages\netaddr\ip\__init__.py”,第 292 行 % 价值) netaddr.core.AddrFormatError: 检测 IP 版本失败: '::1'

我感到相当沮丧,我不知道从这里去哪里......建议?

【问题讨论】:

    标签: python python-3.x subnet cidr


    【解决方案1】:

    ipaddr 模块是在 3.1 开发周期中添加的(介于 alpha 2 和 beta 1 之间),但在 3.1 的第一个候选版本之前被删除。它不是任何已发布 Python 版本的标准库的一部分。您仍然可以从例如PyPI 下载并安装它。

    netaddr 失败似乎是netaddr 本身的一个错误。它尝试检测 IPv6 支持并失败。我猜这是模块中的错误,但很难猜测修复或解决方法。

    【讨论】:

      【解决方案2】:

      netaddr 还不支持 Python 3.x(如自述文件中所述)。

      但是,它将在即将发布的版本 (0.7.5) 中实现。我会以此为暗示,我应该快点把它拿出来!

      我在项目错误跟踪器上添加了一张票:-

      http://code.google.com/p/netaddr/issues/detail?id=55

      谢谢。

      【讨论】:

      • 如果python 3.3中包含了“ipaddress”模块,是否有理由维护netaddr库?您的解释帖子将有助于理解为什么需要另一个库。
      【解决方案3】:

      模块ipaddress 包含在python 3.3 中,它是ipaddr 模块的新版本。

      ipaddress 与 PyPI 上可用的 ipaddr 模块向后不兼容。

      主要区别在于:

      • ipaddress *Network 类等效于 ipaddr *Network 类对应项,其中 strict 标志设置为 True。
      • ipaddress *Interface 类等效于 ipaddr *Network 类对应项,其中 strict 标志设置为 False。
      • ipaddress 中的工厂函数已重命名以消除它们与类的歧义。
      • 重命名了一些属性以消除其用途的歧义。 (例如网络、网络地址)
        • 在 ipaddr 中返回容器的许多方法和函数现在返回迭代器。这包括子网、address_exclude、summarize_address_range 和 collapse_address_list。

      欲了解更多信息,请参阅PEP-3144

      【讨论】:

        猜你喜欢
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        相关资源
        最近更新 更多