From 37ed88e4dfd2d4920d8b8251785d8a26cf0d9593 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Tue, 28 Jul 2020 13:51:32 +0300 Subject: [PATCH] daemon: use Popen on Mac Turns out macs are not happy with double-forks without exec. Fixes #4294 --- dvc/daemon.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/dvc/daemon.py b/dvc/daemon.py index 666f0b4132..0251fb1f2a 100644 --- a/dvc/daemon.py +++ b/dvc/daemon.py @@ -3,6 +3,7 @@ import inspect import logging import os +import platform import sys from subprocess import Popen @@ -15,25 +16,24 @@ DETACHED_PROCESS = 0x00000008 -def _spawn_windows(cmd, env): - from subprocess import STARTUPINFO, STARTF_USESHOWWINDOW - +def _popen(cmd, **kwargs): prefix = [sys.executable] if not is_binary(): prefix += [sys.argv[0]] + return Popen(prefix + cmd, close_fds=True, shell=False, **kwargs) + + +def _spawn_windows(cmd, env): + from subprocess import STARTUPINFO, STARTF_USESHOWWINDOW + creationflags = CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS startupinfo = STARTUPINFO() startupinfo.dwFlags |= STARTF_USESHOWWINDOW - Popen( - prefix + cmd, - env=env, - close_fds=True, - shell=False, - creationflags=creationflags, - startupinfo=startupinfo, + _popen( + cmd, env=env, creationflags=creationflags, startupinfo=startupinfo, ).communicate() @@ -65,8 +65,13 @@ def _spawn_posix(cmd, env): sys.stdout.close() sys.stderr.close() - os.environ.update(env) - main(cmd) + if platform.system() == "Darwin": + # workaround for MacOS bug + # https://github.com/iterative/dvc/issues/4294 + _popen(cmd, env=env).communicate() + else: + os.environ.update(env) + main(cmd) os._exit(0) # pylint: disable=protected-access