Solía usar perl -c programfile para comprobar la sintaxis de un programa Perl y, a continuación, salir sin ejecutarla. Hay una forma equivalente a hacer esto por una secuencia de comandos de Python?

6 Comentarios

  1. 534

    Puede comprobar que la sintaxis mediante la compilación es:

    python -m py_compile script.py
    • import script, pero todo el código debe estar en funciones. Que es una buena práctica, de todos modos. Incluso he adoptado la presente para secuencias de comandos de shell. A partir de aquí es un pequeño paso para las pruebas unitarias.
    • no funcionará si usted tiene incorporado un motor con inyecta módulos
    • python -m compileall también se puede hacer de directorios de forma recursiva y tiene una mejor interfaz de línea de comandos.
    • Gran respuesta, pero ¿cómo se puede prevenir para crear «.pyc» archivo? ¿Cuál es el uso de «.pyc» el archivo por el camino?
    • Así que si mycode.pyc archivo de existir la optimización del rendimiento es obtenido a pesar de que cuando nos encontramos python mycode.py, estoy en lo cierto?
    • Alguien me puede decir cómo este comando trabajo? Cuando probé por este código: print time.timezone (sin import time), no había ningún mensaje en absoluto después de ejecutar el comando.
    • Para Python 2.7.9, cuando -m py_compile está presente, me estoy dando cuenta de que ni -B ni PYTHONDONTWRITEBYTECODE suprime la creación de la .pyc de archivo.
    • compileall ignora las fuentes no termina con «.py» y yo no podría trabajar a su alrededor.
    • Yo uso python -m py_compile para compilar un python2 de secuencia de comandos y pasar…
    • Cabe señalar que el uso de este método, python devolverá una salida distinto de cero condición de que el código compile falla. Así que usted puede incorporar esto en un script de compilación si te gusta.
    • Ideal para la comprobación de la sintaxis utilizada en Vim función..
    • Me maldijo python para años debido a mi script fracasar debido a un error de sintaxis en el controlador de excepciones instrucción print….esta debe ser la segunda cosa enseñó después de enseñar el modo interactivo.
    • ¿Cuál es la salida después de la ejecución de este comando? Yo no veo ninguna *.pyc los archivos generados. Si no se devuelve, ¿eso significa que mi sintaxis está bien?

  2. 56

    Puede utilizar estas herramientas:

    • Todos estos hacen mucho más que comprobar la sintaxis. Realmente esta no es la respuesta.
    • Todos estos comprobación de la sintaxis, por lo que la respuesta es correcta. Otros controles son un (muy útil) de bonificación.
  3. 17
    import sys
    filename = sys.argv[1]
    source = open(filename, 'r').read() + '\n'
    compile(source, filename, 'exec')

    Guardar como checker.py y ejecutar python checker.py yourpyfile.py.

    • Un poco demasiado pesado para un Makefile para una pequeña colección de scripts, pero hace el trabajo y no produce ningún archivo no deseado.
    • Es una vieja respuesta, pero algo a notar es que esto sólo comprueba la sintaxis, no se si la secuencia de comandos se podría ejecutar con éxito.
    • Muchas gracias. Funciona. Sólo un comentario, no hay una respuesta si el código es correcto. De lo contrario, los mensajes de error con los números de línea se muestran.
  4. 1

    Aquí otra solución, utilizando el ast módulo:

    python -c "import ast; ast.parse(open('programfile').read())"

    Hacerlo limpiamente desde dentro de una secuencia de comandos 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)
    • Impresionante una línea que no requieren de la importación de librerías o de producir .pyc archivos. Gracias!
  5. 0

    por alguna razón ( soy un py novato… )- m la llamada no funciona …

    así que aquí es una fiesta de contenedor 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

Dejar respuesta

Please enter your comment!
Please enter your name here