Вы используете две разные версии библиотеки, причем версия в Windows старше, чем версия 0.53. Начиная с версии 0.53, проект websocket
различает поведение обратного вызова между связанными методами и обычными функциями .
Вы передаете связанные методы (self.on_open
и self.on_ws_message
), в этот момент аргумент ws
равен и не передан в . Предполагается, что эти методы, как ожидается, будут иметь доступ к веб-сокету уже через свой экземпляр, возможно, потому, что ожидаемый вариант использования заключается в создании подкласса из класса сокетов .
К сожалению, это не задокументировано проектом, и изменение , похоже, вызывает проблемы у большего количества людей .
Так что для версии 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()
:
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'