python 杀死 subprocess 的子进程(当 shell=True 时)

有如下命令:

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

第二种方法新测好用!!!!!!

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    436 引用 • 612 回帖 • 540 关注

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...