Python:subprocess.Popenを使ってメインプログラムから実行中の子プロセスを終了させたいとき

Pythonのロゴ Python

例えばこんなプログラム。
MP3ファイルを子プロセスとして再生させて3秒たったらそのプロセスを終了する、というプログラム作ってみたがうまくいかない。subprocess.Popen の戻り値を利用して kill メソッドを使っても停止してくれないのだ。

subprocess_ng.c

1import time
2import subprocess
3 
4cmd = "omxplayer -o local /home/pi/harehareyukai.mp3"   # omxplayerでMP3を再生
5proc = subprocess.Popen(cmd, shell=True)    # プロセスを実行
6print("PID = {}".format(proc.pid))      # 実行中のプロセスIDを表示
7 
8time.sleep(3)   # 3秒再生
9 
10proc.kill() # プロセスを終了(終了しない!)

次のように subprocess.Popenの引数を増やして、終了コマンドを os.killpgコマンドとすることできちんと終了できる。

subprocess_stop.py

1import os
2import time
3import signal
4import subprocess
5 
6cmd = "omxplayer -o local /home/pi/harehareyukai.mp3"
7proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)  # プロセスを実行
8print("PID = {}".format(proc.pid))      # 実行中のプロセスIDを表示
9 
10time.sleep(3)   # 3秒再生
11 
12os.killpg(os.getpgid(proc.pid), signal.SIGTERM) # プロセスを終了

引数がだいぶ多くなったが、これでわたしの場合うまくいった。

1つ1つの引数の意味を調べてみたがわたしには分からなかった。以下のサイトを参考にした。

https://www.it-swarm-ja.tech/ja/python/shell-true%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9Fpython%E3%82%B5%E3%83%96%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/971996897/

コメント

タイトルとURLをコピーしました