我试图杀死一个子进程,开始于:
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()
*需要指定它是我在标准输入中写入的字节