cli: check for closed stdout/stderr

This commit is contained in:
Peter Rowlands
2022-04-05 22:05:22 +09:00
committed by Peter Rowlands (변기호)
parent fa7b371c74
commit ee0a47f166
+12 -1
View File
@@ -1,6 +1,7 @@
"""This module provides an entrypoint to the dvc cli and parsing utils."""
import logging
import sys
# Workaround for CPython bug. See [1] and [2] for more info.
# [1] https://github.com/aws/aws-cli/blob/1.16.277/awscli/clidriver.py#L55
@@ -48,6 +49,16 @@ def main(argv=None): # noqa: C901
from dvc.exceptions import DvcException, NotDvcRepoError
from dvc.logger import FOOTER, disable_other_loggers
# NOTE: stderr/stdout may be closed if we are running from dvc.daemon.
# On Linux we directly call cli.main after double forking and closing
# the copied parent's standard file descriptors. If we make any logging
# calls in this state it will cause an exception due to writing to a closed
# file descriptor.
if sys.stderr.closed: # pylint: disable=using-constant-test
logging.disable()
elif sys.stdout.closed: # pylint: disable=using-constant-test
logging.disable(logging.INFO)
args = None
disable_other_loggers()
@@ -68,7 +79,7 @@ def main(argv=None): # noqa: C901
logger.trace(args)
if not args.quiet:
if not sys.stdout.closed and not args.quiet:
from dvc.ui import ui
ui.enable()