1#!/usr/bin/env python3 2 3helpdoc = """ 4A simple utility that verifies the syntax for python scripts. 5The checks it does are : 6 * Check for 'tab' characters in .py files 7 * Compile errors in py sources 8Usage: 9 python syntax_checker.py <python_source_file> [<python_source_file> ..] 10""" 11import sys 12import os 13import re 14 15tabs_search_rex = re.compile("^\s*\t+",re.MULTILINE|re.DOTALL) 16 17def find_non_ascii(s): 18 for c in s: 19 if ord(c) >= 0x80: return True 20 return False 21 22if __name__ == "__main__": 23 if len(sys.argv) < 2: 24 print("Error: Unknown arguments", file=sys.stderr) 25 print(helpdoc) 26 sys.exit(1) 27 for fname in sys.argv[1:]: 28 if not os.path.exists(fname): 29 print("Error: Cannot recognize %s as a file" % fname, file=sys.stderr) 30 sys.exit(1) 31 if fname.split('.')[-1] != 'py': 32 print("Note: %s is not a valid python file. Skipping." % fname) 33 continue 34 fh = open(fname) 35 strdata = fh.readlines() 36 lineno = 0 37 syntax_fail = False 38 for linedata in strdata: 39 lineno += 1 40 if len(tabs_search_rex.findall(linedata)) > 0 : 41 print("Error: Found a TAB character at %s:%d" % (fname, lineno), file=sys.stderr) 42 syntax_fail = True 43 if find_non_ascii(linedata): 44 print("Error: Found a non ascii character at %s:%d" % (fname, lineno), file=sys.stderr) 45 syntax_fail = True 46 if syntax_fail: 47 print("Error: Syntax check failed. Please fix the errors and try again.", file=sys.stderr) 48 sys.exit(1) 49 #now check for error in compilation 50 try: 51 with open(fname, 'r') as file: 52 source = file.read() + '\n' 53 compile_result = compile(source, fname, 'exec') 54 except Exception as exc: 55 print(str(exc), file=sys.stderr) 56 print("Error: Compilation failed. Please fix the errors and try again.", file=sys.stderr) 57 sys.exit(1) 58 print("Success: Checked %s. No syntax errors found." % fname) 59 sys.exit(0) 60 61