在等待完成时如何杀死一个Python子进程?

在等待完成时如何杀死一个Python子进程?

问题描述:

尝试使用Python子流程在Raspberry Pi上播放音频,并在按下GPIO连接的按钮时终止子流程。在等待完成时如何杀死一个Python子进程?

我遇到的问题是,当播放文件之间存在子进程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 

您可以使用终端来做到这一点。 ps aux | grep的TASKNAME 须藤杀死-9的taskid

subprocess模块文档:

Popen.wait()

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

使用communicate()尝试你杀子前