Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python子进程';什么在等着结束?_Python_Subprocess_Gpio_Alsa - Fatal编程技术网

如何在Python子进程';什么在等着结束?

如何在Python子进程';什么在等着结束?,python,subprocess,gpio,alsa,Python,Subprocess,Gpio,Alsa,尝试使用Python子进程在Raspberry Pi上播放音频,并在按下GPIO连接按钮时终止子进程 我遇到的问题是,当播放文件之间有一个subprocess Popen.wait()命令时,子进程不会终止。如果只有一个文件要播放,则无需等待它完成,p.kill()命令也可以正常工作。一旦插入了p.wait(),这样文件就不会相互重叠,Popen.kill()就不再工作 已尝试在中使用os.kill() . 在Popen.wait()下找不到有关子流程行为的任何其他资源。我正在寻找一种方法来强制

尝试使用Python子进程在Raspberry Pi上播放音频,并在按下GPIO连接按钮时终止子进程

我遇到的问题是,当播放文件之间有一个subprocess Popen.wait()命令时,子进程不会终止。如果只有一个文件要播放,则无需等待它完成,p.kill()命令也可以正常工作。一旦插入了p.wait(),这样文件就不会相互重叠,Popen.kill()就不再工作

已尝试在中使用os.kill() . 在Popen.wait()下找不到有关子流程行为的任何其他资源。我正在寻找一种方法来强制下面代码中的aplay函数在第二个代码段中的三个play_wav命令执行期间随时按下按钮关闭,而不是只执行一个play_wav命令

下面是利用subprocess.Popen()的play_wav函数:

下面是调用play_wav函数的代码片段:

# determine what to do when a button is pressed
def button_pressed(channel):
    global MENU
    btnval = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS) # check value of ADC
    if btnval > 980: # 1
        if p.poll() == None:
            p.kill()
        if MENU == 1:
            play_wav("/media/pi/WONDERPHONE/prompts/en/Menu1.wav")
            p.wait()
            play_wav("/media/pi/WONDERPHONE/stories/1/PersonalStory.wav")
            p.wait()
            play_wav("/media/pi/WONDERPHONE/prompts/en/returntomain.wav")
我如何检查按钮按下:

GPIO.add_event_detect(PRESSED, GPIO.RISING, callback=button_pressed, bouncetime=500) # look for button presses

您可以使用终端来实现这一点。 ps aux| grep任务名
sudo kill-9 taskid来自
子流程
模块文档:

等等

等待子进程终止。设置并返回returncode属性。 警告-当使用stdout=PIPE和/或stderr=PIPE时,这将导致死锁,并且子进程将生成足够的输出到管道,从而阻止等待OS管道缓冲区接受更多数据。使用communicate()可以避免这种情况

在终止子进程之前,请尝试使用
communicate()

GPIO.add_event_detect(PRESSED, GPIO.RISING, callback=button_pressed, bouncetime=500) # look for button presses