質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

並列実行の処理、またはdiscord.pyのrunについて停止文を書きたい

Kos_
Kos_

総合スコア3

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

1クリップ

564閲覧

投稿2022/03/27 01:45

編集2022/06/13 14:42

前提

Python、Discord Botともに初心者です。

現在PythonでDiscord Botを作成しており、discord.pyを用いて個人へDMを送信するプログラムを書きました。
メッセージの送信自体はうまくいきました。
しかしながら以下に記載するプログラムの中の一部分の実行が止まらず、ShellにてKeyboardInterruptを挟まないと実行停止ができません。
これを外部からの新たな入力なしで、すなわちそのプログラム内で完結して終了させたいと考えています。

「試したこと」欄に記載の①(discord.pyについて)または②(discordは関係なく、外部関数からの強制終了について)のどちらかさえ片付けばよいと考えています。

該当のソースコード

Python

#user_idとtokenは伏せさせていただいております import discord client = discord.Client() @client.event async def on_ready(): user = await client.fetch_user(user_id) await user.send("Hello there!") client.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

import time import asyncio async def main(): try: print('main() start') await asyncio.wait_for(test(), timeout=3) print('main() finish') except asyncio.TimeoutError: print('test() time out') async def test(): while True: time.sleep(1) asyncio.run(main())
>>> main() start

ここで停止してしまってタイムアウトができません。ほかのmoduleでも同様の現象が起きました。Ctrl Cでのみ離脱できました。
以上のことを踏まえて、ある一定の時間が経った後にタイムアウトをするように、②プログラム内の外部の関数の強制力によって別の関数を実行停止する方法を教えていただきたいです。
可能であるのならば実行するファイルは複数に跨って別のものを止める、という形式でも構いません(どちらかといえば同一ファイル内での完結を望みます)。

よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

実行環境
Windows 10
Visual Studio Code 1.65.2

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。