summaryrefslogtreecommitdiffstats
path: root/Lib/subprocess.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-01-16 14:26:20 (GMT)
committerGitHub <noreply@github.com>2019-01-16 14:26:20 (GMT)
commit07858894689047c77f9c12ddc061d30681368d19 (patch)
tree265342755fa909a3db267cc7274f7cdb8929b405 /Lib/subprocess.py
parent92b8322e7ea04b239cb1cb87b78d952f13ddfebb (diff)
downloadcpython-07858894689047c77f9c12ddc061d30681368d19.zip
cpython-07858894689047c77f9c12ddc061d30681368d19.tar.gz
cpython-07858894689047c77f9c12ddc061d30681368d19.tar.bz2
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.
Diffstat (limited to 'Lib/subprocess.py')
-rw-r--r--Lib/subprocess.py13
1 files changed, 10 insertions, 3 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index b94575b..d63cf20 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 @@ class Popen(object):
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 @@ class Popen(object):
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 @@ class Popen(object):
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