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

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

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

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

Q&A

3回答

706閲覧

subprocessを使って後からメソッドを実行したい

takadaimiku

総合スコア76

Python

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

0グッド

0クリップ

投稿2023/05/09 14:22

実現したいこと

カウントを表示し続けるプログラムをsubprocessを用いて後からカウントを停止させたい。

前提

pythonで以下のようなcnt.pyを書いています。
毎秒カウントをするコードです。

python

1import time 2 3is_start = True 4cnt = 1 5 6def stop(): 7 is_start = False 8 9while is_start: 10 print(cnt) 11 time.sleep(1) 12 cnt += 1

これを以下の様なsub.pyで実行します。

python

1import subprocess 2import time 3p = subprocess.Popen(['python', 'cnt.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 4

これではcnt.pyは永遠にカウントをし続けてしまいます。
5秒後にsub.pyからsubprocessを使ってカウントを停止させる方法を教えてください。

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

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

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

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

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

guest

回答3

0

5秒後にsub.pyからsubprocessを使ってカウントを停止させる方法

cnt.py を実行している Python プロセスの stdinsub.py から文字列を出力する方法もあるかと思います。cnt.py 側では stdin への入力を別スレッドで待ちます。
※ カウントアップの状況が判らないので、cnt.py を実行している Python プロセスの stdoutsub.py 側の stdout にリダイレクトしています

sub.py

python

1import subprocess 2import sys 3import threading 4 5p = subprocess.Popen(['python', 'cnt.py'], 6 stdin=subprocess.PIPE, stdout=sys.stdout, stderr=subprocess.PIPE, 7 encoding='utf-8') 8 9# send stop command after 5 seconds 10t = threading.Timer(5, lambda: p.stdin.write('stop\n')) 11t.start() 12t.join() 13print('stopped.')

cnt.py

python

1import sys 2import threading 3import time 4 5def stop(): 6 global is_start 7 is_start = False 8 9def read_command(): 10 cmd = sys.stdin.readline().rstrip() 11 if cmd == 'stop': stop() 12 13if __name__ == '__main__': 14 is_start = True 15 cnt = 1 16 17 thread = threading.Thread(target=read_command) 18 thread.start() 19 20 while is_start: 21 print(cnt) 22 time.sleep(1) 23 cnt += 1 24 25 thread.join()

実行結果

bash

1$ python sub.py 21 32 43 54 65 7stopped.

投稿2023/05/09 19:04

melian

総合スコア20655

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

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

0

プロセスの外からそのプロセスを強制的に止めるというのはあまりよい作法ではありません。方法はあります。

また、cnt.py の stop()関数を外から呼ぶ方法があるのではないかと思っているのだと思いますが、そのようなことはできません。

プロセスを外から止める場合、プロセス間通信という仕組みを使います。プロセス間通信にはいろいろな方法があります。調べればいろいろ出てくるので適切なものを選べばいいでしょう。

一例としては、ファイルを使った方法です。
止められる側のプロセスが、特定のディレクトリの特定の名前のファイルを定期的に監視し、そのファイルが有れば(もしくは無ければ)自分は停止するようにします。

投稿2023/05/09 15:44

TakaiY

総合スコア13790

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

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

0

cnt.pyで、5秒経過で停止するようにコードを組みましょう

投稿2023/05/09 15:01

y_waiwai

総合スコア88042

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

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

takadaimiku

2023/05/09 15:06

そういう話ではありません。 やりたいことはsubprocessで実行したプログラムに後からきっかけを与えてstop()を実行させることができるかという話です。 それを簡略化して伝えるためにカウントのコードを提示しているだけです。そりゃやりたいことが5秒後に停止させるということならばこんな回りくどいコードは書きません^^;
y_waiwai

2023/05/09 15:14

なら、相互に通信させるようにして、cnt.py側のコードで、何らかの信号を受信したらコードを終了させるようにする、ように組みましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問