Linux 为什么我的ffmpeg进程在没有stdin参数的情况下永远等待subprocess.run?
我使用python子流程模块调用ffmpeg,如下所示:Linux 为什么我的ffmpeg进程在没有stdin参数的情况下永远等待subprocess.run?,linux,python-3.x,shell,subprocess,Linux,Python 3.x,Shell,Subprocess,我使用python子流程模块调用ffmpeg,如下所示: def ffmpeg_wait(self, fname, args): ffmpeg = subprocess.run([ 'ffmpeg', '-v', 'quiet', '-i', fname, *args], stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE, uni
def ffmpeg_wait(self, fname, args):
ffmpeg = subprocess.run([
'ffmpeg', '-v', 'quiet', '-i', fname, *args],
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
universal_newlines=True)
print('terminated')
(out,err) = (ffmpeg.stdout, ffmpeg.stderr)
return out + err
这个很好用。一个示例调用:
self.ffmpeg_wait(fname,
['-r', str(sps), '-s', '320x240', '-f', 'image2', 'tmp/%06d.png'])
我想知道的是,当我省略stdin
参数时,为什么它不起作用。在这种情况下,当我在shell中作为后台进程启动程序时,ffmpeg进程将永远等待。在前台运行是可行的
我想这与shell如何处理stdio通道以及它们如何被子进程继承有关,但我无法理解。我尝试(未成功)在shell中重新建立这种行为(使用重定向)
有任何解释或文档说明吗
PS:ffprobe不这样做。即使没有stdin参数,它也始终有效。因此,ffmpeg中也有触发这种行为的因素。如果你不告诉它忽略
stdin
,它希望图像本身(不仅仅是文件名)来自stdin
,就好像你坐在那里,逐字节输入图像一样。这对于*nix系统中的“管道”命令非常重要,但这意味着,如果不将许多命令显式地定向到除stdin
之外的其他输入流,则它们将显示为挂起状态。我不知道ffmpeg总是使用stdin。在那之后,找到选择并在shell中重新建立相同的行为就没有问题了。谢谢你的提示。