[Python-checkins] bpo-35537: subprocess can now use os.posix_spawnp (GH-11579)

Victor Stinner webhook-mailer at python.org
Wed Jan 16 09:26:26 EST 2019


https://github.com/python/cpython/commit/07858894689047c77f9c12ddc061d30681368d19
commit: 07858894689047c77f9c12ddc061d30681368d19
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2019-01-16T15:26:20+01:00
summary:

bpo-35537: subprocess can now use os.posix_spawnp (GH-11579)

The subprocess module can now use the os.posix_spawnp() function,
if it is available, to locate the program in the PATH.

files:
M Doc/whatsnew/3.8.rst
M Lib/subprocess.py
M Lib/test/pythoninfo.py

diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index 053fe902c481..05fb4ffe03bb 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -281,8 +281,7 @@ Optimizations
 
   * *close_fds* is false;
   * *preexec_fn*, *pass_fds*, *cwd*, *stdin*, *stdout*, *stderr* and
-    *start_new_session* parameters are not set;
-  * the *executable* path contains a directory.
+    *start_new_session* parameters are not set.
 
 * :func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`,
   :func:`shutil.copytree` and :func:`shutil.move` use platform-specific
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index b94575b8401e..d63cf2050634 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -655,6 +655,7 @@ def _use_posix_spawn():
 
 
 _USE_POSIX_SPAWN = _use_posix_spawn()
+_HAVE_POSIX_SPAWNP = hasattr(os, 'posix_spawnp')
 
 
 class Popen(object):
@@ -1442,7 +1443,10 @@ def _get_handles(self, stdin, stdout, stderr):
 
 
         def _posix_spawn(self, args, executable, env, restore_signals):
-            """Execute program using os.posix_spawn()."""
+            """Execute program using os.posix_spawnp().
+
+            Or use os.posix_spawn() if os.posix_spawnp() is not available.
+            """
             if env is None:
                 env = os.environ
 
@@ -1456,7 +1460,10 @@ def _posix_spawn(self, args, executable, env, restore_signals):
                         sigset.append(signum)
                 kwargs['setsigdef'] = sigset
 
-            self.pid = os.posix_spawn(executable, args, env, **kwargs)
+            if _HAVE_POSIX_SPAWNP:
+                self.pid = os.posix_spawnp(executable, args, env, **kwargs)
+            else:
+                self.pid = os.posix_spawn(executable, args, env, **kwargs)
 
         def _execute_child(self, args, executable, preexec_fn, close_fds,
                            pass_fds, cwd, env,
@@ -1484,7 +1491,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds,
                 executable = args[0]
 
             if (_USE_POSIX_SPAWN
-                    and os.path.dirname(executable)
+                    and (_HAVE_POSIX_SPAWNP or os.path.dirname(executable))
                     and preexec_fn is None
                     and not close_fds
                     and not pass_fds
diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py
index 7e94a31cecea..93d87be41588 100644
--- a/Lib/test/pythoninfo.py
+++ b/Lib/test/pythoninfo.py
@@ -612,7 +612,8 @@ def collect_get_config(info_add):
 
 def collect_subprocess(info_add):
     import subprocess
-    copy_attributes(info_add, subprocess, 'subprocess.%s', ('_USE_POSIX_SPAWN',))
+    attrs = ('_USE_POSIX_SPAWN', '_HAVE_POSIX_SPAWNP')
+    copy_attributes(info_add, subprocess, 'subprocess.%s', attrs)
 
 
 def collect_info(info):



More information about the Python-checkins mailing list