gpt4 book ai didi

python - 调用 ffmpeg 仅在后台杀死脚本

转载 作者:行者123 更新时间:2023-11-28 18:43:08 33 4
gpt4 key购买 nike

我有一个 python 脚本,它通过子进程调用 ffmpeg 来执行一些 mp3 操作。它在前台运行良好,但如果我在后台运行它,它会达到 ffmpeg 命令的程度,而该命令本身会将其配置转储到 stderr 中。此时,一切都停止了,父任务被报告为已停止,没有在任何地方引发异常。我已经尝试了一些其他简单的命令来代替 ffmpeg,它们在前台或后台正常执行。

这是问题的最小示例:

import subprocess

inf = "3HTOSD.mp3"
outf = "out.mp3"

args = [ "ffmpeg",
"-y",
"-i", inf,
"-ss", "0",
"-t", "20",
outf
]

print "About to do"

result = subprocess.call(args)

print "Done"

我真的搞不懂包装进程为什么或如何导致父进程终止而不至少引发错误,以及它如何只发生在如此小众的情况下。这是怎么回事?

此外,我知道 ffmpeg 不是最好的软件包,但我正在与使用 ffmpeg 编译到其中的东西进行交互,因此再次使用它似乎是明智的。

最佳答案

可能与Linux process in background - “Stopped” in jobs?有关例如,使用 parent.py:

from subprocess import check_call

check_call(["python", "-c", "import sys; sys.stdin.readline()"])

如果您在 bash 中将它作为后台作业运行,应该重现问题:“parent.py 脚本显示为已停止”:

$ python parent.py &
[1] 28052
$ jobs
[1]+ Stopped python parent.py

如果父process is in an orphaned process group then it is killed on receiving SIGTTIN signal (a signal to stop) .

解决方案是重定向输入:

import os
from subprocess import check_call
try:
from subprocess import DEVNULL
except ImportError: # Python 2
DEVNULL = open(os.devnull, 'r+b', 0)

check_call(["python", "-c", "import sys; sys.stdin.readline()"], stdin=DEVNULL)

如果不需要看ffmpeg stdout/stderr;你也可以将它们重定向到 /dev/null:

check_call(ffmpeg_cmd, stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)

关于python - 调用 ffmpeg 仅在后台杀死脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642616/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com