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 文件进行合唱。
没有wait(),系统认为进程是存活的。
有了wait(),系统就知道进程已经死了,然后重新启动它。
不过,这个过程还是在发声。显然我无法杀死它。
EDIT2:问题是 omxplayer 启动了第二个我没有杀死的进程,它负责实际的音乐。
我试过使用这个代码,在互联网上的几个地方都可以找到,它似乎对每个人都有效,但对我无效
playing_long.stdin.write('q')
playing_long.stdin.flush()
并打印 '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()
我正在尝试终止一个以以下方式开始的子进程:
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 文件进行合唱。
没有wait(),系统认为进程是存活的。
有了wait(),系统就知道进程已经死了,然后重新启动它。
不过,这个过程还是在发声。显然我无法杀死它。
EDIT2:问题是 omxplayer 启动了第二个我没有杀死的进程,它负责实际的音乐。
我试过使用这个代码,在互联网上的几个地方都可以找到,它似乎对每个人都有效,但对我无效
playing_long.stdin.write('q') playing_long.stdin.flush()
并打印 '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()