如何在不执行Python脚本的情况下检查其语法?


Answers:


590

您可以通过编译来检查语法:

python -m py_compile script.py

9
import script,但所有代码都必须在函数中。无论如何,这是个好习惯。我什至在shell脚本中都采用了这种方式。从这里开始,这是进行单元测试的一小步。
Henk Langeveld

1
如果您具有带有注入模块的嵌入式引擎,则将无法正常工作
n611x007 2013年

57
python -m compileall还可以递归执行目录,并具有更好的命令行界面。
C2H5OH

9
很好的答案,但是如何防止它创建“ .pyc”文件?顺便说一下,“。pyc”文件有什么用?
pdubois

4
对于Python 2.7.9,当-m py_compile存在时,我发现既不-B也不 PYTHONDONTWRITEBYTECODE禁止创建.pyc文件。
DavidRR 2015年


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 2015年

1
这是一个古老的答案,但是需要注意的是,这仅检查语法,而不检查脚本是否可以成功执行。
瓦伦丁'16

非常感谢。有用。仅提供一条评论,如果代码正确,将没有答案。否则,将显示带有行号的错误消息。
musbach '18

5

这是使用ast模块的另一种解决方案:

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

要在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)

1
很棒的一类程序,不需要所有导入的lib或产生.pyc文件。谢谢!
mmell


1

Pyflakes会执行您所要求的操作,它只会检查语法。从文档:

Pyflakes做出了一个简单的承诺:它永远不会抱怨样式,并且会非常非常努力地避免产生误报。

Pyflakes也比Pylint或Pychecker更快。这主要是因为Pyflakes仅检查每个文件的语法树。

要安装和使用:

$ pip install pyflakes
$ pyflakes yourPyFile.py

0

由于某些原因(我是py新手...),-m调用不起作用...

所以这是一个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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.