我正在尝试使用为python 2编写的代码,并且可以使用python 3.6.0运行,但它不能与python 3.6.4一起运行。它导入IN模块,并使用IN.IP_RECVERR。我试图谷歌它,但它是一个''很难找到一个名为IN的模块(命名失败?)。要在REPL中演示,它在python 2中有效,但在3.6.4中无效:
$ python2
Python 2.7.14 (default, Jan 5 2018, 10:41:29)
[GCC 7.2.1 20171224] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import IN
>>> IN.IP_RECVERR
11
>>>
$ python3
Python 3.6.4 (default, Jan 5 2018, 02:35:40)
[GCC 7.2.1 20171224] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import IN
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'IN'
>>>
在较新版本的python 3中,这个IN模块的替代品是什么?
答案 0 :(得分:1)
这可能是私人plat-linux/IN.py
模块,从未打算使用。已经有计划删除这些plat-*
文件几年,但看起来最终发生在issue 28027的3.6。如What's New in Python 3.6中所述:
已移除未记录的
IN
,CDROM
,DLFCN
,TYPES
,CDIO
和STROPTS
模块。它们已经在平台特定的Lib/plat-*/
目录中可用,但是长期过时,跨平台不一致,并且没有维护。创建这些模块的脚本仍可在Tools/scripts/h2py.py
的源代码发布中使用。
大多数有用的常量至少在某种程度上是可移植的(就像在你的旧笔记本电脑的Linux和你全新的Galaxy的Linux上,如果不是在OS X或Solaris上那样,可以预期它们可用并且工作原理相同)长期以来一直通过stdlib的其他地方提供。
我认为你正在寻找的这个特定的一个例子并非完全无用,但不够便携,无法安全放置,因为linux记录了IP_RECVERR
的存在,但没有它的价值。因此,您确实需要自己系统的ip
标题中的版本。
如果您确实需要IN
模块,安全地执行此操作的方法是在您需要的特定平台上使用您正在使用的Python版本运行Tools/scripts/h2py.py
。这将从您系统(或交叉编译目标)上的相应标头生成IN.py
,然后您可以在该系统上使用该标头。如果你想分发你的代码,你可能需要在setup.py
中做一个步骤,所以它将在安装时运行(并且在安装前的人的轮子构建时间)建造轮子,但你可能需要小心确保目标足够具体。)
如果您不需要特别便携,只需要访问仅在笔记本电脑或公司的相同容器或类似设备上部署的几个脚本中的一个值,您可能会更好关闭硬编码值(用一个很好的恐吓评论来解释细节)。