From d1740542d4f2f1cb8423e7ed343b4b23ff1ac3fa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 23 Mar 2021 01:21:30 +0100 Subject: [PATCH] bpo-41718: subprocess imports grp and pwd on demand The shutil and subprocess modules now only import the grp and pwd modules when they are needed, which is not the case by default in subprocess. --- Lib/shutil.py | 26 ++++++++++++++------------ Lib/subprocess.py | 21 +++++++++------------ 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/Lib/shutil.py b/Lib/shutil.py index 89d924dec8aa4ed..e29fe4d83e92779 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -32,16 +32,6 @@ except ImportError: _LZMA_SUPPORTED = False -try: - from pwd import getpwnam -except ImportError: - getpwnam = None - -try: - from grp import getgrnam -except ImportError: - getgrnam = None - _WINDOWS = os.name == 'nt' posix = nt = None if os.name == 'posix': @@ -843,8 +833,14 @@ def _is_immutable(src): def _get_gid(name): """Returns a gid, given a group name.""" - if getgrnam is None or name is None: + if name is None: + return None + + try: + from grp import getgrnam + except ImportError: return None + try: result = getgrnam(name) except KeyError: @@ -855,8 +851,14 @@ def _get_gid(name): def _get_uid(name): """Returns an uid, given a user name.""" - if getpwnam is None or name is None: + if name is None: return None + + try: + from pwd import getpwnam + except ImportError: + return None + try: result = getpwnam(name) except KeyError: diff --git a/Lib/subprocess.py b/Lib/subprocess.py index d375514b2dd0a66..4b011e4ce557940 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -53,14 +53,6 @@ from time import monotonic as _time import types -try: - import pwd -except ImportError: - pwd = None -try: - import grp -except ImportError: - grp = None try: import fcntl except ImportError: @@ -875,7 +867,9 @@ def __init__(self, args, bufsize=-1, executable=None, "current platform") elif isinstance(group, str): - if grp is None: + try: + import grp + except ImportError: raise ValueError("The group parameter cannot be a string " "on systems without the grp module") @@ -901,7 +895,9 @@ def __init__(self, args, bufsize=-1, executable=None, gids = [] for extra_group in extra_groups: if isinstance(extra_group, str): - if grp is None: + try: + import grp + except ImportError: raise ValueError("Items in extra_groups cannot be " "strings on systems without the " "grp module") @@ -927,10 +923,11 @@ def __init__(self, args, bufsize=-1, executable=None, "the current platform") elif isinstance(user, str): - if pwd is None: + try: + import pwd + except ImportError: raise ValueError("The user parameter cannot be a string " "on systems without the pwd module") - uid = pwd.getpwnam(user).pw_uid elif isinstance(user, int): uid = user