Python 2中IN模块的替代方案及Python3.6.4兼容问题咨询
解决Python3中IN模块及IP_RECVERR不可用的问题
首先得给你理清这个IN模块的来头——它从来不是Python标准库的公开模块,在Python2里它是个私有、平台相关的内部模块,本质是对Linux系统头文件<linux/in.h>的封装,用来暴露一些底层网络常量(比如你用到的IP_RECVERR),因为是非公开的,所以官方没文档,谷歌搜不到很正常。
至于为什么Python3.6.0能跑,3.6.4却不行?原因很简单:Python3的不同小版本里,这类私有兼容模块的存在情况是不稳定的,3.6.0可能还保留了对Python2这个模块的兼容,但3.6.4里官方移除了这个私有模块,所以你就导入失败了。
解决方案:替换为Python3的标准用法
你不需要依赖这个私有模块,直接用Python3标准库的socket模块来替代:
优先使用socket模块的公开常量
大部分Linux下的网络常量,Python3的socket模块已经直接暴露了,你可以试试直接导入:import socket # 替换代码里的IN.IP_RECVERR为socket.IP_RECVERR如果socket模块未暴露该常量,手动定义
要是你的Python3版本里socket模块没有IP_RECVERR(极少数情况),可以手动定义它的系统值——Linux下IP_RECVERR的数值是11:import socket try: IP_RECVERR = socket.IP_RECVERR except AttributeError: # Linux系统下IP_RECVERR的固定值 IP_RECVERR = 11之后把代码里所有
IN.IP_RECVERR的地方替换成这个IP_RECVERR变量就行。
额外提醒
以后写跨版本的Python代码,一定要避免依赖这类非公开的私有模块,尽量使用官方文档里明确列出的标准库API,这样代码的兼容性才会有保障。
内容的提问来源于stack exchange,提问作者Attila123
相关产品推荐
相关产品推荐

