<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Websocket on heppoko blog</title><link>https://blog-0847c6.gitlab.io/tags/websocket/</link><description>Recent content in Websocket on heppoko blog</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Fri, 01 Dec 2023 00:00:00 +0900</lastBuildDate><atom:link href="https://blog-0847c6.gitlab.io/tags/websocket/index.xml" rel="self" type="application/rss+xml"/><item><title>[Python] ModuleNotFoundError: No module named 'websockets.legacy' のエラーが出た</title><link>https://blog-0847c6.gitlab.io/posts/2023/12/01/python/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0900</pubDate><guid>https://blog-0847c6.gitlab.io/posts/2023/12/01/python/</guid><description>&lt;p&gt;Python のアプリを Nuitka で実行ファイルにして動かすと、Websockets に関するエラーが出ました。&lt;/p&gt;
&lt;p&gt;尚、python で実行したときには正常に動作しています。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Python 3.11&lt;/li&gt;
&lt;li&gt;Nuitka 1.9.2&lt;/li&gt;
&lt;li&gt;Websockets 11.0.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="エラーの内容"&gt;&lt;a href="#%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%ae%e5%86%85%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;エラーの内容
&lt;/h2&gt;&lt;p&gt;具体的には以下のようなエラーが出ました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traceback (most recent call last):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/main.py&amp;#34;, line 36, in subprocess
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/asyncio/runners.py&amp;#34;, line 190, in run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/asyncio/runners.py&amp;#34;, line 118, in run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/asyncio/base_events.py&amp;#34;, line 653, in run_until_complete
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/websocket_manager.py&amp;#34;, line 47, in run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/websocket_client.py&amp;#34;, line 38, in run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/websockets/imports.py&amp;#34;, line 77, in __getattr__
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;/foo/websockets/imports.py&amp;#34;, line 27, in import_name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ModuleNotFoundError: No module named &amp;#39;websockets.legacy&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="とりあえずの対処法"&gt;&lt;a href="#%e3%81%a8%e3%82%8a%e3%81%82%e3%81%88%e3%81%9a%e3%81%ae%e5%af%be%e5%87%a6%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;とりあえずの対処法
&lt;/h2&gt;&lt;p&gt;以下に同じエラーの報告がありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/python-websockets/websockets/issues/974" target="_blank" rel="noopener"
 &gt;https://github.com/python-websockets/websockets/issues/974&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記を参考に以下のように変更すればとりあえず解決しました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;変更前&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import websockets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;async for websocket in websockets.connect(uri):
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;変更後&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import websockets.client
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;async for websocket in websockets.client.connect(uri):
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="本来の解決方法"&gt;&lt;a href="#%e6%9c%ac%e6%9d%a5%e3%81%ae%e8%a7%a3%e6%b1%ba%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;本来の解決方法
&lt;/h2&gt;&lt;p&gt;上記のコードですが、どうやらこれは古い記述方法みたいです。&lt;br&gt;
最近の websockets (11.x 以降) では、接続の作成と処理は以下のように行うことを推奨しているようです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import websockets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;while True:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; async with websockets.connect(uri) as websocket:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # メッセージ処理 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; except Exception:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # ここに再接続ロジックなど 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; await asyncio.sleep(retry_delay)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、これで今回のエラーが解決するかどうかは試していません。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/python-websockets/websockets/issues/974" target="_blank" rel="noopener"
 &gt;https://github.com/python-websockets/websockets/issues/974&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>