2017-09-27 367 views
0

嘗試使用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 

回答

0

您可以使用終端來做到這一點。 ps aux | grep的TASKNAME 須藤殺死-9的taskid

1

subprocess模塊文檔:

Popen.wait()

等待子進程終止。設置並返回returncode屬性。 警告 - 當使用stdout = PIPE和/或stderr = PIPE時,會發生死鎖,並且子進程會向管道生成足夠的輸出,從而阻止等待OS管道緩衝區接受更多數據。使用通信()來避免這種情況。

使用communicate()嘗試你殺子前