プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2023/12/01

[Python] ModuleNotFoundError: No module named 'websockets.legacy' のエラーが出た

event_note2023/12/01 7:35

Python のアプリを Nuitka で実行ファイルにして動かすと、Websockets に関するエラーが出ました。

尚、python で実行したときには正常に動作しています。

環境

  • Python 3.11
  • Nuitka 1.9.2
  • Websockets 11.0.3

エラーの内容

具体的には以下のようなエラーが出ました。

Traceback (most recent call last):
  File "/foo/main.py", line 36, in subprocess
  File "/foo/asyncio/runners.py", line 190, in run
  File "/foo/asyncio/runners.py", line 118, in run
  File "/foo/asyncio/base_events.py", line 653, in run_until_complete
  File "/foo/websocket_manager.py", line 47, in run
  File "/foo/websocket_client.py", line 38, in run
  File "/foo/websockets/imports.py", line 77, in __getattr__
  File "/foo/websockets/imports.py", line 27, in import_name
ModuleNotFoundError: No module named 'websockets.legacy'

とりあえずの対処法

以下に同じエラーの報告がありました。

上記を参考に以下のように変更すればとりあえず解決しました。

変更前

import websockets

async for websocket in websockets.connect(uri):

変更後

import websockets.client

async for websocket in websockets.client.connect(uri):

本来の解決方法

上記のコードですが、どうやらこれは古い記述方法みたいです。
最近の websockets (11.x 以降) では、接続の作成と処理は以下のように行うことを推奨しているようです。

import websockets

while True:
    try:
        async with websockets.connect(uri) as websocket:
            # メッセージ処理 
    except Exception:
        # ここに再接続ロジックなど 
    await asyncio.sleep(retry_delay)

ただし、これで今回のエラーが解決するかどうかは試していません。