在等待完成时,你如何杀死Python子进程?

时间:2017-09-27 03:46:33

标签: python subprocess gpio alsa

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

我遇到的问题是,当播放文件之间存在子进程Popen.wait()命令时,子进程不会被终止。如果只有一个文件可以播放,则无需等待它完成,并且p.kill()命令工作正常。插入p.wait()后,文件就不会在彼此之上播放,Popen.kill()不再有效。

已经尝试过使用os.kill()了 Kill a running subprocess call。无法找到有关子进程在Popen.wait()下的行为方式的任何其他资源。我正在寻找一种方法来强制下面代码中的aplay功能在第二个代码片段中的三个play_wav命令期间随时关闭按钮,而不是只有一个play_wav命令。

这里是使用subprocess.Popen()的play_wav函数:

# play wav file on the attached system sound device
def play_wav(wav_filename):
    global p
    msg = "playing " + wav_filename
    logger.debug(msg)
    p = subprocess.Popen(
        ['aplay','-i','-D','plughw:1', wav_filename],
        stdin = subprocess.PIPE,
        stdout = subprocess.PIPE,
        stderr = subprocess.STDOUT,
        shell = False
    )

这是一段调用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

2 个答案:

答案 0 :(得分:1)

来自subprocess模块文档:

  

Popen.wait()

     

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

在杀死子流程之前尝试使用communicate()

答案 1 :(得分:0)

您可以使用终端来执行此操作。 ps aux | grep任务名称 sudo kill -9 taskid