파이썬 스크립트의 구문을 실행하지 않고 어떻게 확인할 수 있습니까?


368

나는 perl -c programfilePerl 프로그램의 구문을 확인하고 그것을 실행하지 않고 종료하는 데 사용했습니다. 파이썬 스크립트에서 이것을 수행하는 동등한 방법이 있습니까?

답변:


590

구문을 컴파일하여 확인할 수 있습니다.

python -m py_compile script.py

9
import script하지만 모든 코드는 함수에 있어야합니다. 어쨌든 좋은 연습입니다. 쉘 스크립트에도 이것을 채택했습니다. 여기에서부터 단위 테스트에 이르는 작은 단계입니다.
Henk Langeveld

1
주입 된 모듈이 내장 된 엔진이있는 경우 작동하지 않습니다
n611x007

57
python -m compileall디렉토리를 재귀 적으로 수행 할 수 있으며 더 나은 명령 행 인터페이스가 있습니다.
C2H5OH

9
좋은 대답이지만 ".pyc"파일을 만들 때 어떻게 방지 할 수 있습니까? 그런데 ".pyc"파일의 사용법은 무엇입니까?
pdubois

4
Python 2.7.9 의 경우 .pyc 파일 생성을 억제 하거나 억제 -m py_compile하지 -B않습니다 . PYTHONDONTWRITEBYTECODE
DavidRR

59

다음 도구를 사용할 수 있습니다.


10
이것들은 모두 구문을 확인하는 것보다 훨씬 더 많은 일을합니다. 실제로 이것은 답이 아닙니다.
Matt Joiner

22
이 모든 것이 구문을 확인하므로 정답입니다. 다른 수표는 (매우 유용한) 보너스입니다.
johndodo

19
import sys
filename = sys.argv[1]
source = open(filename, 'r').read() + '\n'
compile(source, filename, 'exec')

이것을 checker.py로 저장하고 실행하십시오 python checker.py yourpyfile.py.


1
작은 스크립트 수집을 위해 Makefile에 비해 너무 무겁지만 작업을 수행하고 원치 않는 파일을 생성하지 않습니다.
proski

1
오래된 대답이지만 주목해야 할 것은 스크립트가 성공적으로 실행되는지 여부가 아니라 구문 만 검사한다는 것입니다.
vallentin

고마워 효과가있다. 하나의 주석 만 있으면 코드가 올바른 경우 답변이 없습니다. 그렇지 않으면 줄 번호가있는 오류 메시지가 표시됩니다.
musbach

5

다음은 ast모듈을 사용하는 또 다른 솔루션입니다 .

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

파이썬 스크립트 내에서 깔끔하게하려면 :

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)

1
가져온 모든 라이브러리가 필요하지 않거나 .pyc 파일을 생성하지 않는 멋진 단일 라이너. 감사!
mmell


1

Pyflakes는 요청한 내용을 수행하고 구문 만 확인합니다. 문서에서 :

Pyflakes는 간단한 약속을합니다. 스타일에 대해 불평하지 않으며 거짓 긍정을 나타내지 않기 위해 매우 열심히 노력할 것입니다.

Pyflakes는 Pylint 또는 Pychecker보다 빠릅니다. Pyflakes는 각 파일의 구문 트리 만 개별적으로 검사하기 때문입니다.

설치하고 사용하려면 :

$ pip install pyflakes
$ pyflakes yourPyFile.py

0

어떤 이유로 (나는 파이 초보자입니다 ...) -m 호출이 작동하지 않았습니다 ...

여기에 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.