我有一个使用subprocess.Popen
启动子进程的python脚本。子进程然后启动一个外部命令(在我的情况下,它播放一个MP3)。 python脚本需要能够中断子进程,所以我使用了描述here的方法,该方法为子进程提供了自己的会话ID。不幸的是,当我现在关闭python脚本时,子进程将继续运行。Python,在脚本结束时使用不同的SID关闭子进程
如何确保从脚本启动的子进程,但是如果在python脚本停止时仍然会关闭不同的会话ID?
我有一个使用subprocess.Popen
启动子进程的python脚本。子进程然后启动一个外部命令(在我的情况下,它播放一个MP3)。 python脚本需要能够中断子进程,所以我使用了描述here的方法,该方法为子进程提供了自己的会话ID。不幸的是,当我现在关闭python脚本时,子进程将继续运行。Python,在脚本结束时使用不同的SID关闭子进程
如何确保从脚本启动的子进程,但是如果在python脚本停止时仍然会关闭不同的会话ID?
TL; DR更改POPEN PARAMS:拆分了POPEN CMD(前"list -l"
- >["list", "-l"]
),并使用Shell=False
~~~
迄今为止所见过的最佳解决方案wa我只是不使用shell=True
作为Popen的一个参数,因为我并不真的需要shell=True
,所以我只是简单地使用它,因为Popen不会识别我的cmd字符串,而且我太懒惰也把它分成了一个参数列表。这给我带来了很多其他问题(例如,使用.terminate()
变成同时使用外壳变得更复杂了,需要有它的会话ID,见here)
只需从一个字符串分割CMD成参数列表让我使用Popen.terminate()而不必给它自己的会话ID,通过没有一个单独的会话ID进程将被关闭,当python脚本停止
Is there any way to kill a Thread in Python? ,并确保您使用它作为线程
import threading
from subprocess import call
def thread_second():
call(["python", "secondscript.py"])
processThread = threading.Thread(target=thread_second) # <- note extra ','
processThread.start()
print 'the file is run in the background'
我正在调查这一点,我不知道它是尽管在我的情况下是一个很好的解决方案,因为子进程是外部命令。从这篇文章中,python线程不太好处理中断,因此不处理好关闭外部命令 – Alter
阅读此帖杀死线程 – 2017-07-30 21:17:41
https://stackoverflow.com/questions/323972/is-there-any-way-to- kill-a-thread-in-python – 2017-07-30 21:17:52