1 """distutils.spawn
2
3 Provides the 'spawn()' function, a front-end to various platform-
4 specific functions for launching another program in a sub-process.
5 Also provides the 'find_executable()' to search the path for a given
6 executable name.
7 """
8
9 import sys
10 import os
11 import os.path
12
13
14 def find_executable(executable, path=None):
15 """Tries to find 'executable' in the directories listed in 'path'.
16
17 A string listing directories separated by 'os.pathsep'; defaults to
18 os.environ['PATH']. Returns the complete filename or None if not found.
19 """
20 _, ext = os.path.splitext(executable)
21 if (sys.platform == 'win32') and (ext != '.exe'):
22 executable = executable + '.exe'
23
24 if os.path.isfile(executable):
25 return executable
26
27 if path is None:
28 path = os.environ.get('PATH', None)
29 if path is None:
30 try:
31 path = os.confstr("CS_PATH")
32 except (AttributeError, ValueError):
33 # os.confstr() or CS_PATH is not available
34 path = os.defpath
35 # bpo-35755: Don't use os.defpath if the PATH environment variable is
36 # set to an empty string
37
38 # PATH='' doesn't match, whereas PATH=':' looks in the current directory
39 if not path:
40 return None
41
42 paths = path.split(os.pathsep)
43 for p in paths:
44 f = os.path.join(p, executable)
45 if os.path.isfile(f):
46 # the file exists, we have a shot at spawn working
47 return f
48 return None