]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41718: subprocess imports grp and pwd on demand (GH-24987)
authorVictor Stinner <vstinner@python.org>
Tue, 23 Mar 2021 16:42:51 +0000 (17:42 +0100)
committerGitHub <noreply@github.com>
Tue, 23 Mar 2021 16:42:51 +0000 (17:42 +0100)
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
Lib/subprocess.py

index 89d924dec8aa4edf2d1a41cae36e481bcfc311e2..e29fe4d83e927790558f0d542e8e9ae392ac397a 100644 (file)
@@ -32,16 +32,6 @@ try:
 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:
index d375514b2dd0a6654b42130e99a972447fb9ba31..4b011e4ce5579402121405b1a2084e619f6ceb35 100644 (file)
@@ -53,14 +53,6 @@ import contextlib
 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 @@ class Popen(object):
                                  "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 @@ class Popen(object):
             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 @@ class Popen(object):
                                  "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