Python 需要通过userinput(GPIO.input)结束子流程的循环

Python 需要通过userinput(GPIO.input)结束子流程的循环,python,bash,subprocess,record,raspberry-pi2,Python,Bash,Subprocess,Record,Raspberry Pi2,我需要在一个python程序中对一个raspberry pi执行一个bash命令,该命令启动一个记录,如果声音高于某个频率,并且在8秒后结束,或者如果没有声音,则开始记录。录制完成后,它会自动启动并等待录制新的声音。每条记录都标有时间。这就是我在这里引用的代码: while GPIO.input(26) == False: timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') process = subproce

我需要在一个python程序中对一个raspberry pi执行一个bash命令,该命令启动一个记录,如果声音高于某个频率,并且在8秒后结束,或者如果没有声音,则开始记录。录制完成后,它会自动启动并等待录制新的声音。每条记录都标有时间。这就是我在这里引用的代码:

while GPIO.input(26) == False:
    timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    process = subprocess.Popen ("rec -c 2 -r 192000 --buffer 50000 -b 32" + filepath + timestamp + ".wav sinc 0.1k silence 1 0.1 0.8% 1 0.4 0.8% vol 6 trim 0 8", shell = True)
    process.communicate()
如您所见,要完成循环,程序将等待GPIO输入信号(按钮)。我有一个额外的代码,它查找子进程的名称并终止它

但我的问题是:当循环运行时,它只在一个记录完成和一个新记录开始之间的毫秒内“寻找”输入。如果我在记录期间按下按钮,循环将在记录之后继续。只有在中间按下按钮,循环才会断开

起初,我认为while循环可能是一个不好的选择……但是如果我没有错的话,问题似乎是正在运行的子流程

所以这里是我的问题:我如何才能完成这个记录循环,但可以通过GPIO的用户输入在运行记录时停止/终止(ctrl+c不是一个可行的选项)


非常感谢

问题在于
while
循环每次仅通过循环检查一次条件call等待
rec
命令完成,因此您完全正确-按钮只检查一次,就在
rec
之后和
时间戳=…
之前

解决方案是在单独的线程中观察按钮,与
rec
并行运行。建议使用RPi.GPIO库中的按钮。请尝试以下操作:

should_exit = False

def my_callback(channel):
    if GPIO.input(26):
        should_exit = True

GPIO.add_event_detect(26, GPIO.RISING, callback=my_callback, bouncetime=300)

while not should_exit:
    timestamp = ...

按下按钮时,
my\u callback
例程应运行,并设置
should\u exit
标志。一旦
rec
完成,
while
将检查
should\u exit
并终止。(警告-未测试!)

非常感谢,我会尝试它-我的问题是,我也想取消运行记录-但我猜-通过这种方式我可以执行kill脚本OK,我尝试过它-事件检测有时可以工作-但它似乎非常不可靠Leglad它总比没有好!恐怕我没有RPi.GPIO的个人经验。推送吗按钮具有正确的上拉或下拉功能?所有连接都牢固吗?间歇性操作可能是硬件问题。此外,请尝试一个不运行
rec
但只打印调试消息的循环,看看按钮是否被正确检测到。我将尝试它,谢谢。直到知道有时它不起作用,否则它将连续工作2次然后停止检测某些东西,有一段时间它工作得很好,时间更长,但也停止在输入中检测-可能是正常的GPIO.in和检测调用之间的干扰,而GPIO.input(26)=False: