Solía usar perl -c programfilepara verificar la sintaxis de un programa Perl y luego salir sin ejecutarlo. ¿Hay una forma equivalente de hacer esto para un script de Python?
Solía usar perl -c programfilepara verificar la sintaxis de un programa Perl y luego salir sin ejecutarlo. ¿Hay una forma equivalente de hacer esto para un script de Python?
Respuestas:
Puede verificar la sintaxis compilándola:
python -m py_compile script.py
python -m compileallTambién puede hacer directorios de forma recursiva y tiene una mejor interfaz de línea de comandos.
-m py_compileestá presente, encuentro que -Bni PYTHONDONTWRITEBYTECODEsuprime la creación del archivo .pyc .
Puedes usar estas herramientas:
import sys
filename = sys.argv[1]
source = open(filename, 'r').read() + '\n'
compile(source, filename, 'exec')
Guarde esto como checker.py y ejecútelo python checker.py yourpyfile.py.
Aquí hay otra solución, usando el astmódulo:
python -c "import ast; ast.parse(open('programfile').read())"
Para hacerlo limpiamente desde un script de 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)
Quizás útil verificador en línea PEP8: http://pep8online.com/
Pyflakes hace lo que le pides, solo verifica la sintaxis. De los documentos:
Pyflakes hace una promesa simple: nunca se quejará del estilo, e intentará muy, muy difícil nunca emitir falsos positivos.
Pyflakes también es más rápido que Pylint o Pychecker. Esto se debe principalmente a que Pyflakes solo examina el árbol de sintaxis de cada archivo individualmente.
Para instalar y usar:
$ pip install pyflakes
$ pyflakes yourPyFile.py
por alguna razón (soy un novato py ...) la llamada -m no funcionó ...
así que aquí hay una función de envoltura bash ...
# ---------------------------------------------------------
# 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, pero todo el código debe estar en funciones. Lo cual es una buena práctica de todos modos. Incluso he adoptado esto para los scripts de shell. A partir de aquí, es un pequeño paso para las pruebas unitarias.