summaryrefslogtreecommitdiff
path: root/spawn.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-04-17 16:26:36 +0200
committerGitHub <noreply@github.com>2019-04-17 16:26:36 +0200
commit1d1c462903645fa567508a1272ed28c5f334c24c (patch)
treee09ec47d27256abbf2fd6bc37683c2ba629ed73c /spawn.py
parentef2792fe08aabeb870e8f489d2bbfe2898ce1766 (diff)
downloadpython-setuptools-git-1d1c462903645fa567508a1272ed28c5f334c24c.tar.gz
bpo-35755: shutil.which() uses os.confstr("CS_PATH") (GH-12858)
shutil.which() and distutils.spawn.find_executable() now use os.confstr("CS_PATH") if available instead of os.defpath, if the PATH environment variable is not set. Don't use os.confstr("CS_PATH") nor os.defpath if the PATH environment variable is set to an empty string to mimick Unix 'which' command behavior. Changes: * find_executable() now starts by checking for the executable in the current working directly case. Add an explicit "if not path: return None". * Add tests for PATH='' (empty string), PATH=':' and for PATHEXT.
Diffstat (limited to 'spawn.py')
-rw-r--r--spawn.py39
1 files changed, 25 insertions, 14 deletions
diff --git a/spawn.py b/spawn.py
index 53876880..88832727 100644
--- a/spawn.py
+++ b/spawn.py
@@ -172,21 +172,32 @@ def find_executable(executable, path=None):
A string listing directories separated by 'os.pathsep'; defaults to
os.environ['PATH']. Returns the complete filename or None if not found.
"""
- if path is None:
- path = os.environ.get('PATH', os.defpath)
-
- paths = path.split(os.pathsep)
- base, ext = os.path.splitext(executable)
-
+ _, ext = os.path.splitext(executable)
if (sys.platform == 'win32') and (ext != '.exe'):
executable = executable + '.exe'
- if not os.path.isfile(executable):
- for p in paths:
- f = os.path.join(p, executable)
- if os.path.isfile(f):
- # the file exists, we have a shot at spawn working
- return f
- return None
- else:
+ if os.path.isfile(executable):
return executable
+
+ if path is None:
+ path = os.environ.get('PATH', None)
+ if path is None:
+ try:
+ path = os.confstr("CS_PATH")
+ except (AttributeError, ValueError):
+ # os.confstr() or CS_PATH is not available
+ path = os.defpath
+ # bpo-35755: Don't use os.defpath if the PATH environment variable is
+ # set to an empty string to mimick Unix which command behavior
+
+ # PATH='' doesn't match, whereas PATH=':' looks in the current directory
+ if not path:
+ return None
+
+ paths = path.split(os.pathsep)
+ for p in paths:
+ f = os.path.join(p, executable)
+ if os.path.isfile(f):
+ # the file exists, we have a shot at spawn working
+ return f
+ return None