我正在使用这个python脚本:
import RPi.GPIO as GPIO
import subprocess
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)
try:
while True:
if GPIO.input(4):
GPIO.output(25, 1)
subprocess.call("/script/start.sh", shell=True)
else:
GPIO.output(25, 0)
subprocess.call("/script/stop.sh", shell=True)
sleep(0.2)
finally:
GPIO.cleanup()
(没有子过程)当我按下按钮(GPIO 4)时,LED指示灯亮起,再次按下它并关闭它。效果很好。我目前正在使用2个脚本来启动和停止应用程序。在Python之外使用时,这些工作正常。当我尝试实现子进程时,事情开始变得不稳定。
脚本是:
#!/bin/bash
FILENAME=$(date +"%Y%m%d_%H%M")
rec -c 2 -b 24 -r 48000 -C 320.99 /mnt/usb/${FILENAME}.mp3
exit
和
#!/bin/bash
reco=`pidof -s rec`
kill $reco
exit
该过程将开始,并且它将继续运行,但是python脚本不会关闭它,除非我按下ctrl + c,无法使用GPIO开关。
我想要实现的目标是:
switch = high -> application starts
switch = low -> application stops
等待/循环,这样如果我按下开关,我就可以再次开始录制。
我怎样才能使其正常工作?
答案 0 :(得分:1)
由于您正试图终止您在start.sh
开始的流程。这就是我的建议:
import RPi.GPIO as GPIO
import signal
import subprocess
import os
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)
rec_proc = None
try:
while True:
if GPIO.input(4):
GPIO.output(25, 1)
if rec_proc is None:
rec_proc = subprocess.Popen("/script/start.sh",
shell=True, preexec_fn=os.setsid)
else:
GPIO.output(25, 0)
if rec_proc is not None:
os.killpg(rec_proc.pid, signal.SIGTERM)
rec_proc = None
sleep(0.2)
finally:
GPIO.cleanup()