Früher habe ich perl -c programfile
die Syntax eines Perl-Programms überprüft und dann beendet, ohne es auszuführen. Gibt es eine äquivalente Möglichkeit, dies für ein Python-Skript zu tun?
Früher habe ich perl -c programfile
die Syntax eines Perl-Programms überprüft und dann beendet, ohne es auszuführen. Gibt es eine äquivalente Möglichkeit, dies für ein Python-Skript zu tun?
Antworten:
Sie können die Syntax überprüfen, indem Sie sie kompilieren:
python -m py_compile script.py
python -m compileall
kann Verzeichnisse auch rekursiv ausführen und verfügt über eine bessere Befehlszeilenschnittstelle.
-m py_compile
vorhanden ist, stelle ich fest, dass die Erstellung der .pyc- Datei weder unterdrückt -B
noch PYTHONDONTWRITEBYTECODE
unterdrückt wird .
import sys
filename = sys.argv[1]
source = open(filename, 'r').read() + '\n'
compile(source, filename, 'exec')
Speichern Sie dies als checker.py und führen Sie es aus python checker.py yourpyfile.py
.
Hier ist eine andere Lösung, die das ast
Modul verwendet:
python -c "import ast; ast.parse(open('programfile').read())"
So machen Sie es sauber aus einem Python-Skript heraus:
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)
Vielleicht nützlicher Online-Checker PEP8: http://pep8online.com/
Pyflakes macht das, was Sie verlangen, es überprüft nur die Syntax. Aus den Dokumenten:
Pyflakes macht ein einfaches Versprechen: Es wird sich niemals über Stil beschweren und es wird sehr, sehr schwer sein, niemals falsch positive Ergebnisse zu erzielen.
Pyflakes ist auch schneller als Pylint oder Pychecker. Dies liegt hauptsächlich daran, dass Pyflakes nur den Syntaxbaum jeder Datei einzeln untersucht.
So installieren und verwenden Sie:
$ pip install pyflakes
$ pyflakes yourPyFile.py
Aus irgendeinem Grund (ich bin ein Neuling ...) hat der Anruf -m nicht funktioniert ...
Also hier ist eine Bash-Wrapper-Funktion ...
# ---------------------------------------------------------
# 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
import script
, aber der gesamte Code muss in Funktionen sein. Welches ist sowieso gute Praxis. Ich habe dies sogar für Shell-Skripte übernommen. Von hier aus ist es ein kleiner Schritt zum Unit-Test.