【问题标题】:How do you kill a Python subprocess while it's waiting to finish?如何在等待完成时杀死 Python 子进程?
【发布时间】:2018-03-08 10:15:24
【问题描述】:

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

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

已经尝试在中使用 os.kill() Kill a running subprocess call。找不到关于子进程在 Popen.wait() 下的行为方式的任何其他资源。我正在寻找一种方法来强制下面代码中的 aplay 函数在第二个代码 sn-p 中的三个 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 函数的 sn-p 代码:

# 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

【问题讨论】:

    标签: python subprocess gpio alsa


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      来自subprocess 模块文档:

      Popen.wait()

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2019-03-16
        • 2013-09-24
        相关资源
        最近更新 更多