为什么我的ffmpeg进程在没有stdin参数的情况下永远等待subprocess.run?

时间:2018-07-01 19:43:45

标签: 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,
        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参数时它不起作用。在这种情况下,如果我在外壳程序中将我的程序作为后台进程启动,则 ffmpeg 进程将永远等待。在前台运行有效。

我想这与外壳如何处理stdio通道以及它们如何被子进程继承有关,但是我无法弄清楚。我尝试(未成功)在shell中(使用重定向)重新建立此行为。

有任何解释或文档指针吗?

PS: ffprobe 不这样做。即使没有 stdin 参数,它也始终有效。因此, ffmpeg 中也会触发这种行为。

1 个答案:

答案 0 :(得分:1)

如果您不以某种方式告诉它忽略stdin,它会期望图像本身(不仅仅是文件名)来自stdin,就像您坐在那里并键入图像一样逐字节。这对于在* nix系统中“管道”命令是必不可少的,但是这意味着,如果您未将命令明确定向到stdin以外的其他输入流,则许多命令似乎会挂起。