python 如何终止 popen 进程,shell false [为什么不使用标准方法]

python how to kill a popen process, shell false [why not working with standard methods]

我正在尝试终止一个以以下方式开始的子进程:

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

一段时间后

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

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

How to terminate a python subprocess launched with shell=True

注意我用的是线程,使用线程的时候不建议使用preexec_fn(或者至少我是这么看的,反正也没用)

为什么不起作用?代码中没有错误信息,但我必须手动 kill -9 停止收听 mp3 文件的进程。

谢谢

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

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

并打印 'NoneType' object has no attribute 'write'。即使在启动 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()

*需要指定我在stdin中写的是bytes

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

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()