python - Websocket 代码适用于 Windows 但不适用于 Linux

标签 python linux windows websocket python-3.6

我正在运行相同的代码;以下适用于 Windows,但将在 Ubuntu (16.04) 上正确运行。

import websocket
import json

class WhatEver(object):
    def __init__(self):
        self.ws = websocket.WebSocketApp(
            'wss://beijing.51nebula.com/',
            on_message=self.on_ws_message,
            on_open=self.on_open
        )

    def rin_forever(self):
        print("start run forever")
        self.ws.run_forever()


    def on_ws_message(self, ws,message):
        print (message)
        self.ws.close()

    def _send_msg(self, params):
        call = {"id": 1, "method": "call",
                "params": params}
        self.ws.send(json.dumps(call))

    def on_open(self, ws):
        print("start open function")
        self._send_msg([1, "login", ["",""]])


if __name__ == '__main__':
    ws=WhatEver()
    print("start")
    ws.rin_forever()
    print("close")

我已经尝试重新安装所有模块(包括 Windows 和 Ubuntu 之间相同版本的 Python 和 websocket),此代码在 Windows 系统上的打印是正确的:

start
start run forever
start open function
{"id":1,"jsonrpc":"2.0","result":true}
close

但是当它在 Ubuntu 中运行时,虽然它会打印,但它会遗漏一些打印语句:

start
start run forever
close

当我在 Ubuntu 中调试代码时,我发现主线程停止在 self.ws.run_forever() 调用中并且永远不会跳转到 on_open 函数。然后它爆发了。

最佳答案

您正在使用两个不同版本的库,Windows 上的版本低于 0.53 版。从 0.53 版开始,websocket 项目区分了绑定(bind)方法常规函数之间的回调行为。

您正在传递绑定(bind)方法(self.on_openself.on_ws_message),此时 ws 参数是 没有传入。这些方法显然已经可以通过它们的实例访问 websocket,可能是因为预期的用例是 create a subclass from the socket class。 .

不幸的是,项目没有对此进行记录,更改 appears to have been causing problems for more people .

因此对于 0.53 和更新版本,从回调中删除 ws 参数:

class WhatEver(object):
    def __init__(self):
        self.ws = websocket.WebSocketApp(
            'wss://beijing.51nebula.com/',
            on_message=self.on_ws_message,
            on_open=self.on_open
        )


    # ...

    def on_ws_message(self, message):
        print(message)
        self.ws.close()

    # ...

    def on_open(self):
        print("start open function")
        self._send_msg([1, "login", ["", ""]])

您可以通过启用日志记录来发现此类问题; websocket 模块将它在回调中遇到的异常记录到 logger.getLogger('websocket') 记录器。查看这些问题的一种快速方法是启用跟踪:

websocket.enableTrace(True)

它仅向该日志记录对象添加一个日志记录处理程序,为该对象打开 logging.DEBUG 级别的报告,此外还启用完整的套接字数据回显。

或者您可以配置日志记录以输出一般消息 logging.basicConfig() function :

import logging

logging.basicConfig()

它可以让您看到 logging.ERROR 级及以上级别的消息。

使用后一个选项,打印出未更正版本的代码:

start
start run forever
ERROR:websocket:error from callback <bound method WhatEver.on_open of <__main__.WhatEver object at 0x1119ec668>>: on_open() missing 1 required positional argument: 'ws'
close

您可以通过打印 websocket.__version__ 来验证您安装的 websocket-client 的版本:

>>> import websocket
>>> websocket.__version__
'0.54.0'

关于python - Websocket 代码适用于 Windows 但不适用于 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100975/

相关文章:

html - 如何设置您创建的桌面小工具的大小

python - 在 Python 中更新可变变量时自动执行操作

linux - CentOS 6 .slm 构建编译错误(SteamBoat)

linux - Linux time 命令输出中 real、user 和 sys 的含义

您可以将代码块传递给 C 中的函数吗?

python - 检查目录在 Python 中是否有效

windows - 有没有办法使用 GraalVM 从 Jetpack Compose 桌面应用程序创建 native 二进制文件?

python - 将 Pandas DataFrame 切割成小块,并对每个 block 进行简单的计算

使用 timeit 进行 Python 循环基准测试

python - 如何列出discord.py 中的所有角色