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

标签 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 进程将永远等待,前提是我将我的程序作为 shell 中的后台进程启动。在前台运行。

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

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

PS: ffprobe 不会这样做。即使没有 stdin 参数,它也始终有效。所以它也是 ffmpeg 中触发此行为的东西。

最佳答案

如果您不以某种方式告诉它忽略 stdin,它会期望图像本身(不仅仅是文件名)来自 stdin,就好像您坐在在那里并逐字节输入图像。这对于 *nix 系统中的“管道”命令至关重要,但这意味着如果您不明确将它们定向到 stdin 以外的某些输入流,许多命令将看起来挂起。

关于linux - 为什么我的 ffmpeg 进程在没有 subprocess.run 的 stdin 参数的情况下永远等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126489/

相关文章:

python - 使用迭代和集合重写列表(根据条件删除条目)

linux oneliner 在 18gb 的恢复数据中找到一个恰好包含 23 个字符+换行符(或全部)的文件

linux - 为什么 Plex Media Server 在 Ubuntu 16 上不适合我?

linux - 某些命令无法通过 ssh(shell)在远程服务器上运行

python - 如何扩展 str.isspace()?

bash - 如何防止在 make/shell 中评估字符串?

linux - 如何使用 Linux 命令或 Shell 脚本读取文件的特定行

linux - 如何递归查找并列出具有子目录和时间的目录中的最新修改文件

linux - "Package ... is not in GOROOT "时出现错误 "go run"

python - 使用 Selenium 检查所有复选框