From 00ca7552317bb69ce8eb84582d658d5e52997394 Mon Sep 17 00:00:00 2001 From: John Hawkinson <jhawk@mit.edu> Date: Fri, 21 Oct 2016 20:44:49 -0400 Subject: [PATCH] [get_exe_version] Do version probes with <&- When doing version probes for ffmpeg, do the equivalent of calling it as: ffmpeg -version <&- Where <&- is shell syntax for closing stdin before calling the program. This is roughly equivalent to </dev/null without actually opening /dev/null. This prevents ffmpeg -version from hanging when run in the background. Fixes #955. The reason is that ffmpeg tries to manipulate stdin to set up terminal characteristic, and that causes the kernel to suspend the parent process (youtube-dl). Note that closing stdin is achieved by calling subprocess.Popen() with stdin set to subprocess.PIPE and without passing any input to Popen.communicate(). This is somewhat subtle. --- youtube_dl/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 28941673f..a89ff6908 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -1820,6 +1820,7 @@ def get_exe_version(exe, args=['--version'], try: out, _ = subprocess.Popen( [encodeArgument(exe)] + args, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate() except OSError: return False