J'avais l'habitude d'utiliser perl -c programfile
pour vérifier la syntaxe d'un programme Perl puis quitter sans l'exécuter. Existe-t-il un moyen équivalent de le faire pour un script Python?
J'avais l'habitude d'utiliser perl -c programfile
pour vérifier la syntaxe d'un programme Perl puis quitter sans l'exécuter. Existe-t-il un moyen équivalent de le faire pour un script Python?
Réponses:
Vous pouvez vérifier la syntaxe en la compilant:
python -m py_compile script.py
python -m compileall
peut également faire des répertoires récursivement et a une meilleure interface en ligne de commande.
-m py_compile
est présent, je constate que ni -B
ne PYTHONDONTWRITEBYTECODE
supprime la création du fichier .pyc .
import sys
filename = sys.argv[1]
source = open(filename, 'r').read() + '\n'
compile(source, filename, 'exec')
Enregistrez-le sous checker.py et exécutez python checker.py yourpyfile.py
.
Voici une autre solution, en utilisant le ast
module:
python -c "import ast; ast.parse(open('programfile').read())"
Pour le faire proprement à partir d'un script Python:
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)
Vérificateur en ligne PEP8 peut-être utile: http://pep8online.com/
Pyflakes fait ce que vous demandez, il vérifie simplement la syntaxe. De la documentation:
Pyflakes fait une promesse simple: il ne se plaindra jamais de style, et il s'efforcera très, très fort de ne jamais émettre de faux positifs.
Pyflakes est également plus rapide que Pylint ou Pychecker. C'est en grande partie parce que Pyflakes examine uniquement l'arbre de syntaxe de chaque fichier individuellement.
Pour installer et utiliser:
$ pip install pyflakes
$ pyflakes yourPyFile.py
pour une raison quelconque (je suis un débutant py ...) l'appel -m n'a pas fonctionné ...
voici donc une fonction bash wrapper ...
# ---------------------------------------------------------
# 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
, mais tout le code doit être dans les fonctions. Ce qui est de toute façon une bonne pratique. J'ai même adopté cela pour les scripts shell. De là, c'est une petite étape pour les tests unitaires.