I used to use perl -c programfile
to check the syntax of a Perl program and then exit without executing it. Is there an equivalent way to do this for a Python script?
compilation – How can I check the syntax of Python script without executing it?
The Question :
The Answer 1
You can check the syntax by compiling it:
python -m py_compile script.py
The Answer 2
The Answer 3
import sys filename = sys.argv[1] source = open(filename, 'r').read() + '\n' compile(source, filename, 'exec')
Save this as checker.py and run python checker.py yourpyfile.py
.
The Answer 4
Here’s another solution, using the ast
module:
python -c "import ast; ast.parse(open('programfile').read())"
To do it cleanly from within a Python script:
import ast, traceback filename = 'programfile' with open(filename) as f: source = f.read() valid = True try: ast.parse(source) except SyntaxError: valid = False traceback.print_exc() # Remove to silence any errros print(valid)
The Answer 5
Perhaps useful online checker PEP8 : http://pep8online.com/
The Answer 6
Pyflakes does what you ask, it just checks the syntax. From the docs:
Pyflakes makes a simple promise: it will never complain about style, and it will try very, very hard to never emit false positives.
Pyflakes is also faster than Pylint or Pychecker. This is largely because Pyflakes only examines the syntax tree of each file individually.
To install and use:
$ pip install pyflakes $ pyflakes yourPyFile.py
The Answer 7
for some reason ( I am a py newbie … ) the -m call did not work …
so here is a bash wrapper func …
# --------------------------------------------------------- # check the python synax for all the *.py files under the # <<product_version_dir/sfw/python # --------------------------------------------------------- doCheckPythonSyntax(){ doLog "DEBUG START doCheckPythonSyntax" test -z "$sleep_interval" || sleep "$sleep_interval" cd $product_version_dir/sfw/python # python3 -m compileall "$product_version_dir/sfw/python" # foreach *.py file ... while read -r f ; do \ py_name_ext=$(basename $f) py_name=${py_name_ext%.*} doLog "python3 -c \"import $py_name\"" # doLog "python3 -m py_compile $f" python3 -c "import $py_name" # python3 -m py_compile "$f" test $! -ne 0 && sleep 5 done < <(find "$product_version_dir/sfw/python" -type f -name "*.py") doLog "DEBUG STOP doCheckPythonSyntax" } # eof func doCheckPythonSyntax
The Answer 8
Thanks to the above answers @Rosh Oxymoron. I improved the script to scan all files in a dir that are python files. So for us lazy folks just give it the directory and it will scan all the files in that directory that are python.
import sys import glob, os os.chdir(sys.argv[1]) for file in glob.glob("*.py"): source = open(file, 'r').read() + '\n' compile(source, file, 'exec')
Save this as checker.py and run python checker.py ~/YOURDirectoryTOCHECK