Websocket代码可在Windows上运行,但不能在Linux上运行

时间:2018-11-01 12:07:39

标签: 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函数。然后它爆发了。

1 个答案:

答案 0 :(得分:1)

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

您正在传入绑定方法(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-client来验证已安装的websocket.__version__的版本:

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