diff --git a/news/7118.bugfix b/news/7118.bugfix new file mode 100644 index 00000000000..8cca2e1bf46 --- /dev/null +++ b/news/7118.bugfix @@ -0,0 +1 @@ +Fix a crash when ``sys.stdin`` is set to ``None``, such as on AWS Lambda. diff --git a/news/7119.bugfix b/news/7119.bugfix new file mode 100644 index 00000000000..8cca2e1bf46 --- /dev/null +++ b/news/7119.bugfix @@ -0,0 +1 @@ +Fix a crash when ``sys.stdin`` is set to ``None``, such as on AWS Lambda. diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py index 67729649590..56339951048 100644 --- a/src/pip/_internal/utils/misc.py +++ b/src/pip/_internal/utils/misc.py @@ -864,3 +864,10 @@ def protect_pip_from_modification_on_windows(modifying_pip): 'To modify pip, please run the following command:\n{}' .format(" ".join(new_command)) ) + + +def is_console_interactive(): + # type: () -> bool + """Is this console interactive? + """ + return sys.stdin is not None and sys.stdin.isatty() diff --git a/src/pip/_internal/vcs/subversion.py b/src/pip/_internal/vcs/subversion.py index 7a2cd9f6def..6c76d1ad435 100644 --- a/src/pip/_internal/vcs/subversion.py +++ b/src/pip/_internal/vcs/subversion.py @@ -6,11 +6,11 @@ import logging import os import re -import sys from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ( display_path, + is_console_interactive, rmtree, split_auth_from_netloc, ) @@ -188,7 +188,7 @@ def is_commit_id_equal(cls, dest, name): def __init__(self, use_interactive=None): # type: (bool) -> None if use_interactive is None: - use_interactive = sys.stdin.isatty() + use_interactive = is_console_interactive() self.use_interactive = use_interactive # This member is used to cache the fetched version of the current diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index a383f153141..25d39928f35 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -39,6 +39,7 @@ get_prog, hide_url, hide_value, + is_console_interactive, normalize_path, normalize_version_info, parse_netloc, @@ -971,3 +972,18 @@ def test_make_setuptools_shim_args__unbuffered_output(unbuffered_output): unbuffered_output=unbuffered_output ) assert ('-u' in args) == unbuffered_output + + +@pytest.mark.parametrize('isatty,no_stdin,expected', [ + (True, False, True), + (False, False, False), + (True, True, False), + (False, True, False), +]) +def test_is_console_interactive(monkeypatch, isatty, no_stdin, expected): + monkeypatch.setattr(sys.stdin, 'isatty', Mock(return_value=isatty)) + + if no_stdin: + monkeypatch.setattr(sys, 'stdin', None) + + assert is_console_interactive() is expected