2017-09-27 12 views
0

Pythonサブプロセスを使用してRaspberry Piでオーディオを再生しようとしていて、GPIO接続のボタンが押されたときにサブプロセスを強制終了します。終了するのを待っている間にPythonサブプロセスをどのように殺すのですか?

問題は、再生ファイル間にPopen.wait()サブプロセスがある場合、サブプロセスがkillされないことです。再生するファイルが1つしかない場合は、終了するまで待つ必要はなく、p.kill()コマンドは正常に動作します。 p.wait()が挿入されてファイルが互いの上で再生されないとすぐに、Popen.kill()は動作しなくなります。

Kill a running subprocess callでos.kill()を使用して既に試してみました。 Popen.wait()の下でどのようにサブプロセスが動作するかについての他のリソースは見つかりません。私は、1つのplay_wavコマンドを持つのではなく、2番目のコードスニペットの3つのplay_wavコマンドの間に、いつでもボタンを押すと、下のコードでaplay関数を強制終了する方法を探しています。ここで

は)(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 | subprocessモジュールのドキュメントから、タスク名 のsudoのkill -9のtaskId

1

はgrep:

Popen.wait()

子プロセスが終了するまで待ち。 returncode属性を設定して返します。 警告 - これはstdout = PIPEおよび/またはstderr = PIPEを使用するとデッドロックし、子プロセスはパイプに十分な出力を生成し、OSパイプバッファがより多くのデータを受け入れるのをブロックします。それを避けるには、()を使用してください。

あなたがサブプロセス

を殺す前に communicate()を使用してみてください
関連する問題