例えばこんなプログラム。
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つの引数の意味を調べてみたがわたしには分からなかった。以下のサイトを参考にした。
IT swarm
コメント