Q&A
自作でPythonのアプリケーションを作成しています。
その中にDiscord BOTがありますが、その機能をメインのソースコードから分離したくなりました。
Discord BOTを制御する部分を"DiscordModule"として分離・クラス化した時、次のようなエラーが発生しました。
(エラー全文は下に記載してあります。)
cmd
1RuntimeError: Timeout context manager should be used inside a task
これを実行する術があればご教示ください。
ソースコード
ソースコードは、したいことを表現するために簡略化させて頂きました。
main.py (制御する側)
python
1# main.py 2import asyncio 3from discordmodule import DiscordModule # 自作 discordmodule.py 4 5class HostModule: 6 def __init__(self): 7 self.bot = DiscordModule(command_prefix='/') 8 self.task() 9 10 # DiscordModule.send_message() (非同期関数)を使って特定チャンネルにメッセージを送りたい 11 def task(self): 12 asyncio.run(self.bot.send_message(message='メッセージ', channel=123456789)) 13 14instance = HostModule() 15instance.bot.run('トークン')
discordmodule.py (制御される側)
python
1# discordmodule.py 2import traceback 3from discord.ext import commands 4 5class DiscordModule(commands.Bot): 6 def __init__(self, command_prefix): 7 pass 8 9 async def send_message(self, message:str, channel:int): 10 ch = self.get_channel(channel) # discord.TextChannelオブジェクトは取得確認済み 11 try: 12 await ch.send(message) # ここでエラー 13 except: 14 print(traceback.format_exc()) 15
エラー
cmd
1Traceback (most recent call last): 2 File "C:\Works\Python\schedule\main.py", line 11, in task 3 asyncio.run(self.bot.send_message(message=sc['message'], channel=int(sc['channel']), mention=sc['mention'])) 4 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\asyncio\runners.py", line 44, in run 5 return loop.run_until_complete(main) 6 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 641, in run_until_complete 7 return future.result() 8 File "C:\Works\Python\schedule\discordmodule.py", line 10, in send_message 9 await ch.send(message) 10 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\abc.py", line 1065, in send 11 data = await state.http.send_message(channel.id, content, tts=tts, embed=embed, 12 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\http.py", line 192, in request 13 async with self.__session.request(method, url, **kwargs) as r: 14 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\client.py", line 1117, in __aenter__ 15 self._resp = await self._coro 16 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\client.py", line 448, in _request 17 with timer: 18 File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\helpers.py", line 635, in __enter__ 19 raise RuntimeError( 20RuntimeError: Timeout context manager should be used inside a task
回答1件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/05/23 14:50