有如下命令:
import subprocess
command = 'ffmpeg -i input.mp4 output.mp4'
process = subprocess.Popen(self.command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True, encoding='utf-8',startupinfo=subprocessStartUpInfo)
process.kill()
因为使用了 shell=True,结束 process 之后,ffmpeg 子进程并不会被结束。
在 Unix Like 系统上,有以下方法:
os.killpg(os.getpgid(process.pid), signal.SIGTERM)
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
p.kill()
# 这样 cmd 就可以继承 shell,被杀掉。
上面的方法在 Win 上用不了。
stackoverflow 上有这一种解法,不过还没尝试:
import os
import sys
import platform
from subprocess import Popen, PIPE
# set system/version dependent "start_new_session" analogs
kwargs = {}
if platform.system() == 'Windows':
# from msdn [1]
CREATE_NEW_PROCESS_GROUP = 0x00000200 # note: could get it from subprocess
DETACHED_PROCESS = 0x00000008 # 0x8 | 0x200 == 0x208
kwargs.update(creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
elif sys.version_info < (3, 2): # assume posix
kwargs.update(preexec_fn=os.setsid)
else: # Python 3.2+ and Unix
kwargs.update(start_new_session=True)
p = Popen(["C"], stdin=PIPE, stdout=PIPE, stderr=PIPE, **kwargs)
assert not p.poll()
Windows 上第二种方法:
from subprocess import Popen
process = Popen(command, shell=True)
Popen("TASKKILL /F /PID {pid} /T".format(pid=process.pid))
第二种方法新测好用!!!!!!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于