changeset: 101998:96d297e9a8a8 branch: 3.5 parent: 101989:0715d403cae2 user: Martin Panter date: Tue Jun 14 04:08:30 2016 +0000 files: Lib/ctypes/util.py description: Issue #22636: Handle OSError from subprocess, e.g. if command not found diff -r 0715d403cae2 -r 96d297e9a8a8 Lib/ctypes/util.py --- a/Lib/ctypes/util.py Tue Jun 14 01:27:11 2016 +0000 +++ b/Lib/ctypes/util.py Tue Jun 14 04:08:30 2016 +0000 @@ -115,10 +115,13 @@ env = dict(os.environ) env['LC_ALL'] = 'C' env['LANG'] = 'C' - proc = subprocess.Popen(args, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - env=env) + try: + proc = subprocess.Popen(args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + env=env) + except OSError: # E.g. bad executable + return None with proc: trace = proc.stdout.read() finally: @@ -140,9 +143,12 @@ if not f: return None - proc = subprocess.Popen(("/usr/ccs/bin/dump", "-Lpv", f), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL) + try: + proc = subprocess.Popen(("/usr/ccs/bin/dump", "-Lpv", f), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + except OSError: # E.g. command not found + return None with proc: data = proc.stdout.read() res = re.search(br'\[.*\]\sSONAME\s+([^\s]+)', data) @@ -159,9 +165,12 @@ # objdump is not available, give up return None - proc = subprocess.Popen((objdump, '-p', '-j', '.dynamic', f), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL) + try: + proc = subprocess.Popen((objdump, '-p', '-j', '.dynamic', f), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + except OSError: # E.g. bad executable + return None with proc: dump = proc.stdout.read() res = re.search(br'\sSONAME\s+([^\s]+)', dump) @@ -187,11 +196,15 @@ expr = r':-l%s\.\S+ => \S*/(lib%s\.\S+)' % (ename, ename) expr = os.fsencode(expr) - proc = subprocess.Popen(('/sbin/ldconfig', '-r'), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL) - with proc: - data = proc.stdout.read() + try: + proc = subprocess.Popen(('/sbin/ldconfig', '-r'), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + except OSError: # E.g. command not found + data = b'' + else: + with proc: + data = proc.stdout.read() res = re.findall(expr, data) if not res: @@ -214,10 +227,13 @@ args = ('/usr/bin/crle',) paths = None - proc = subprocess.Popen(args, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - env=env) + try: + proc = subprocess.Popen(args, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + env=env) + except OSError: # E.g. bad executable + return None with proc: for line in proc.stdout: line = line.strip()