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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3045閲覧

pythonで標準入力を監視したい

hoge1243

総合スコア22

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/19 02:07

編集2020/07/19 05:45

前提・実現したいこと

プログラム1とプログラム2という関数があります。
プログラム1はinputで命令を受け取り、それに対する答えを返します。
答えを出すには約10秒ほどかかります。
答えを出している間にquitと打ち込んだらプログラム2で反応して、プログラム1を停止させたいです。

import time import threading def program1(): a = input() #本来はここに処理が入るのでtime.sleepで代用 time.sleep(10) print(int(a)+10) def program2(): while True: quit = input() if quit == "quit": #breakでprogram2が終了したのをthreadingのjoinで検知し停止させます break multi_1 = threading.Thread(target=program1) multi_2 = threading.Thread(target=program2) multi_1.start() multi_2.start() multi_2.join()

このような感じです。

発生している問題・エラーメッセージ

これを実行したのですが、試しに1を入力して10秒待っても答えが返ってきません。
どうすれば良いでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2020/07/19 02:13

現象が再現するコード、具体的な再現手順など詳細を記載しないと回答を得るのは難しいと思います。
hoge1243

2020/07/19 02:36

ありがとうございます! 編集してみます。
maai

2020/07/19 03:46

多分、program2がprogram1を起動させてそれを監視しているんですよね? しかしprogram2で唐突にthreadingが出てきているので何をやってるのかよく分かりませんでした。 program1を起動するコマンドの引数に問題がある可能性があるので、特にその部分の掲載、をお願いします。
can110

2020/07/19 04:03

コードの一部分のみ、コードの「感じ」だけでは的確な回答は得られにくいかと思います。
otn

2020/07/19 04:25 編集

> プログラム1をsys.exit()で停止させたいです。 プログラム1を強制終了するんじゃなくて、プログラム1に自分から終了して欲しいという意味? であれば、print(int(a)+10 はどうするの??
hoge1243

2020/07/19 04:47

maaiさん program1とprogram2は同一プログラムの中の関数名です。 なのでprogram2がprogram1を起動しているのではなく、同一プログラムの中からthreadingで呼び出します。 otnさん 強制終了でOKです。 その際はprint(int(a)+10)は実行されません。
otn

2020/07/19 05:06

program2をちゃんと見てませんでした。 別プログラムを別プロセスで動かすのじゃなくて、スレッドで動かすと言うことか。 であれば、共通の停止フラグの変数を作って、program1ではときどきそれを見て自分で終了する。
hoge1243

2020/07/19 05:41

import time import threading def a(): a = input() #本来はここに処理が入るのでtime.sleepで代用 time.sleep(10) print(int(a)+10) def b(): while True: quit = input() if quit == "quit": #breakでprogram2が終了したのをthreadingのjoinで検知し停止させます break multi_1 = threading.Thread(target=a) multi_2 = threading.Thread(target=b) multi_1.start() multi_2.start() multi_2.join() 上のコードを実行し、例えば1を入力して10秒待っても答えが返ってこないのです.
hoge1243

2020/07/19 05:45

質問の方にも書きました
guest

回答1

0

ベストアンサー

コメントに書いたのですが、分からなかったようなので、コードで書きます。

Python

1import time 2import threading 3def program1(): 4 a = input("a:") 5 #本来はここに処理が入るのでtime.sleepで代用 6 if stop_flag.is_set(): return # ループの中など、処理の途中に、このif文をちりばめておく 7 time.sleep(1) 8 if stop_flag.is_set(): return 9 time.sleep(1) 10 if stop_flag.is_set(): return 11 time.sleep(1) 12 if stop_flag.is_set(): return 13 time.sleep(1) 14 if stop_flag.is_set(): return 15 time.sleep(1) 16 if stop_flag.is_set(): return 17 time.sleep(1) 18 if stop_flag.is_set(): return 19 time.sleep(1) 20 if stop_flag.is_set(): return 21 time.sleep(1) 22 if stop_flag.is_set(): return 23 time.sleep(1) 24 if stop_flag.is_set(): return 25 time.sleep(1) 26 print(int(a)+10) 27 28def program2(): 29 while True: 30 quit = input("quit:") 31 if quit == "quit": 32 stop_flag.set() 33 #breakでprogram2が終了したのをthreadingのjoinで検知し停止させます 34 break 35 36stop_flag = threading.Event() 37 38multi_1 = threading.Thread(target=program1) 39multi_2 = threading.Thread(target=program2) 40multi_1.start() 41multi_2.start() 42multi_2.join()

投稿2020/07/19 06:01

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoge1243

2020/07/19 06:06

コードありがとうございます。 実行してみたのですが、1と入力した後、10秒待ってもエンターキーを押さないとprint(int(a)+10)の答え11が出力されないのです。
otn

2020/07/19 06:14

出力されますけど? Windowsの特殊事情があるのかと思って、Windows10で実行してみましたが、ちゃんと表示されます。 回答を書き換えずに実行していますか? Z:\Temp>python 0.py a:1 ← 1を入力 quit:11 ←11が表示される
hoge1243

2020/07/19 08:32

どうやらShellの方だと動かないようですが、コマンドで動かせば普通に動きますね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問