summaryrefslogtreecommitdiff
path: root/Lib/shutil.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
commit228a3c99bdb2d02771bead66a0beabafad3a90d3 (patch)
tree40ff4e1063f1205ad1f32f9005ba3675531c19a4 /Lib/shutil.py
parent71ce03df9c643faa94fbdf73bbb4e99a9a62cbdc (diff)
downloadcpython-git-228a3c99bdb2d02771bead66a0beabafad3a90d3.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 'Lib/shutil.py')
-rw-r--r--Lib/shutil.py13
1 files changed, 12 insertions, 1 deletions
diff --git a/Lib/shutil.py b/Lib/shutil.py
index 7dd470dfab..34df9cc474 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -1309,9 +1309,20 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None):
use_bytes = isinstance(cmd, bytes)
if path is None:
- path = os.environ.get("PATH", os.defpath)
+ 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
+
if use_bytes:
path = os.fsencode(path)
path = path.split(os.fsencode(os.pathsep))