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

Pythonのロゴ Python

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

subprocess_ng.c

import time
import subprocess

cmd = "omxplayer -o local /home/pi/harehareyukai.mp3"	# omxplayerでMP3を再生
proc = subprocess.Popen(cmd, shell=True)	# プロセスを実行
print("PID = {}".format(proc.pid))		# 実行中のプロセスIDを表示

time.sleep(3)	# 3秒再生

proc.kill()	# プロセスを終了(終了しない!)

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

subprocess_stop.py

import os
import time
import signal
import subprocess

cmd = "omxplayer -o local /home/pi/harehareyukai.mp3"
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)	# プロセスを実行
print("PID = {}".format(proc.pid))		# 実行中のプロセスIDを表示

time.sleep(3)	# 3秒再生

os.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をコピーしました