Python 代码在 Ubuntu 14.04 中有效,但在 Win8.1 中无效

Python code works in Ubuntu 14.04 but not in Win8.1

我收到了 this code,我想 运行 我的 windows 8.1 操作系统上的脚本 runCortexReader.py . Spyder 给我这个错误:

AttributeError: 'module' 对象没有属性 'SO_REUSEPORT'

使用 Ubuntu 14.04(使用双引导,而不是虚拟机)

在同一台计算机上使用完全相同的代码与 Spyder 一起工作

问题是,我真的很想 运行 Windows 上的脚本,因为它稍后应该与未安装在 Ubuntu 上的 Matlab 通信。

我在两个系统上都使用 Python 2.7。

有人知道错误可能出在哪里吗?

SO_REUSEPORT(还有SO_REUSEADDR)是套接字相关的设置。在[SO]: How do SO_REUSEADDR and SO_REUSEPORT differ?中,对它们之间的区别有很好的解释。

SO_REUSEPORT 仅出现在较新的 Linux 版本中 - 在 /usr/include/asm-generic/socket.h[=52= 中定义] 的值通常为 15 (#define SO_REUSEPORT 15):

  • Ubuntu14中定义,但在Ubuntu12中没有定义(该行被注释掉: /* To add :#define SO_REUSEPORT 15 */)
  • RHEL 7中定义,但在RHEL 5中没有定义(相同的评论)

另一方面,在 Win 上,Visual Studio 的包含文件中没有定义这样的宏(通常是 Winsock2.h).

此外,[MS.Docs]: setsockopt function 没有在可能的选项名称中提及它。

为了让它在 Win 上运行(虽然这不是一个好方法),你必须做的是注释掉(通过添加 # 开头的字符)引用它的所有行(我在以下文件中找到它,但它可能存在于其他文件中):

  • CortexDecoder.py 第 244 行:

    self.cortexSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
    

or (this is even dirtier) 在同一个文件中,导入 socket 模块后,添加这一行:

socket.SO_REUSEPORT = socket.SO_REUSEADDR