前提
Python、Discord Botともに初心者です。
現在PythonでDiscord Botを作成しており、discord.pyを用いて個人へDMを送信するプログラムを書きました。
メッセージの送信自体はうまくいきました。
しかしながら以下に記載するプログラムの中の一部分の実行が止まらず、ShellにてKeyboardInterruptを挟まないと実行停止ができません。
これを外部からの新たな入力なしで、すなわちそのプログラム内で完結して終了させたいと考えています。
「試したこと」欄に記載の①(discord.pyについて)または②(discordは関係なく、外部関数からの強制終了について)のどちらかさえ片付けばよいと考えています。
該当のソースコード
Python
1#user_idとtokenは伏せさせていただいております 2 3import discord 4 5client = discord.Client() 6 7@client.event 8async def on_ready(): 9 user = await client.fetch_user(user_id) 10 await user.send("Hello there!") 11 12client.run(token)
発生している問題
最終行の client.run(token) が停止しない
例えばclient.run(token)の次の行にprint("hello")を付け加えても実行されず、ずっとclient.runの行を実行し続けている。
試したこと
まずは根本的なclient.runを停止させる方法を模索しました。複数のサイトを探し回ったのですが、どうやらこのclient.runを停止させるのは私の見た限り不可能なようです。
参考にしたソースの一つを記載します。
https://github.com/Rapptz/discord.py/issues/2040
たとえばclient.run()の後ろにclient.close()やclient.logout()を書いてもそもそも実行部分まで到達していないので不可能でした。
この時点で、まず①discord.pyにおけるclient.run()を停止させる方法をお尋ねしたいです。
次に、この①の内容は無理だと片付け、別方向からアプローチを試みました。
asyncio moduleやmultiprocess module、外部ライブラリのtimeout_decorator(これはそもそも私の環境のWindowsでは動かないようでした)などを用いて、別の関数を他で動かし、強制終了を試みましたがいずれも「停止させることができない」との返答がなされました。これは単純にwhile文で試した際にもできなかったので、部分的に不可能であると考えました。以下にwhile文についてasyncio moduleで試した例を示します。
Python
1import time 2import asyncio 3 4async def main(): 5 try: 6 print('main() start') 7 await asyncio.wait_for(test(), timeout=3) 8 print('main() finish') 9 except asyncio.TimeoutError: 10 print('test() time out') 11 12async def test(): 13 while True: 14 time.sleep(1) 15 16asyncio.run(main())
>>> main() start
ここで停止してしまってタイムアウトができません。ほかのmoduleでも同様の現象が起きました。Ctrl Cでのみ離脱できました。
以上のことを踏まえて、ある一定の時間が経った後にタイムアウトをするように、②プログラム内の外部の関数の強制力によって別の関数を実行停止する方法を教えていただきたいです。
可能であるのならば実行するファイルは複数に跨って別のものを止める、という形式でも構いません(どちらかといえば同一ファイル内での完結を望みます)。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
実行環境
Windows 10
Visual Studio Code 1.65.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/13 05:42