Skip to content

Commit

Permalink
bpo-35537: subprocess can now use os.posix_spawnp (GH-11579)
Browse files Browse the repository at this point in the history
The subprocess module can now use the os.posix_spawnp() function,
if it is available, to locate the program in the PATH.
  • Loading branch information
vstinner authored Jan 16, 2019
1 parent 92b8322 commit 0785889
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 6 deletions.
3 changes: 1 addition & 2 deletions Doc/whatsnew/3.8.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 10 additions & 3 deletions Lib/subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,7 @@ def _use_posix_spawn():


_USE_POSIX_SPAWN = _use_posix_spawn()
_HAVE_POSIX_SPAWNP = hasattr(os, 'posix_spawnp')


class Popen(object):
Expand Down Expand Up @@ -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

Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion Lib/test/pythoninfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down

0 comments on commit 0785889

Please sign in to comment.