1

我试图杀死一个子进程,开始于:

playing_long = Popen(["omxplayer", "/music.mp3"], stdout=subprocess.PIPE)

过了一会儿

pid = playing_long.pid
playing_long.terminate()
os.kill(pid,0)
playing_long.kill()

这是行不通的。这里没有指出的解决方案

如何终止使用 shell=True 启动的 python 子进程

注意我正在使用线程,并且不建议在使用线程时使用 preexec_fn (或者至少这是我读到的,无论如何它也不起作用)。

为什么它不工作?代码中没有错误消息,但我必须手动终止 -9 进程才能停止收听 mp3 文件。

谢谢

编辑:从这里开始,我在 kill() 之后添加了一个 wait()。令人惊讶的是,在重新开始该过程之前,我检查这是否仍在等待,这样我就不会使用 mp3 文件开始合唱。

  • 如果没有 wait(),系统会看到该进程处于活动状态。

  • 使用wait(),系统知道进程已经死了,然后重新启动它。

  • 但是,这个过程仍在进行中。显然,我似乎无法杀死它。

EDIT2:问题是 omxplayer 启动了我不杀死的第二个进程,它负责实际的音乐。

  • 我试过使用这个代码,在互联网上的几个地方找到,它似乎对每个人都有效,但不适合我

    playing_long.stdin.write('q')
    playing_long.stdin.flush()
    

它打印“NoneType”对象没有“写”属性。即使在启动 popen 进程后立即使用此代码,它也会失败并显示相同的消息

playing_long = subprocess.Popen(["omxplayer", "/home/pi/Motion_sounds/music.mp3"], stdout=subprocess.PIPE)
time.sleep(5)
playing_long.stdin.write('q')
playing_long.stdin.flush()

EDIT3:然后的问题是我没有在 popen 行中建立 stdin 行。现在它是

playing_long = subprocess.Popen(["omxplayer", "/home/pi/Motion_sounds/music.mp3"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
time.sleep(5)
playing_long.stdin.write(b'q')
playing_long.stdin.flush()

*需要指定它是我在标准输入中写入的字节

4

1 回答 1

0

然后最终解决方案(请参阅问题中编辑的过程):

playing_long = subprocess.Popen(["omxplayer", "/home/pi/Motion_sounds/music.mp3"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
time.sleep(5)
playing_long.stdin.write(b'q')
playing_long.stdin.flush()
于 2015-01-28T08:34:32.540 回答