例えばこんなプログラム。
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/
コメント