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