2016-03-04 57 views
2

我只想为我的Python脚本提供最简单的方法来问“是我刚刚生成的语法上有效的Python的Python代码?”如何验证Python脚本的语法?

我想:

try: 
    import py_compile 
    x = py_compile.compile(generatedScriptPath, doraise=True) 
    pass 

except py_compile.PyCompileError, e: 
    print str(e) 
    pass 

但是,即使含有无效Python中的文件时,没有抛出异常,之后x == None

+1

你可以简单地尝试导入生成的模块并捕获ImportError(如果模块丢失)或SyntaxError(如果模块无效)?或者,'ast.parse'会在解析无效的Python代码时引发异常。 –

+1

无效的Python是什么意思? – Selcuk

+0

如果您只是想解析模块,您可以使用['ast'](https://docs.python.org/2/library/ast.html)模块的['parse'](https:// docs。 python.org/2/library/ast.html#ast.parse)函数。事实上,有一个['compile'](https://docs.python.org/2/library/functions.html#compile)内置函数可以用来做到这一点。 – Bakuriu

回答

3

没有必要使用py_compile。它的用途是从给定的源文件中写入一个字节码文件。事实上,如果您没有权限在目录中写入,它将会失败,因此最终可能会出现一些错误的结果。

只需解析并验证语法,即可使用ast模块以parse的文件内容,或直接调用compile内置函数。

import ast 

def is_valid_python_file(fname): 
    with open(fname) as f: 
     contents = f.read() 
    try: 
     ast.parse(contents) 
     #or compile(contents, fname, 'exec', ast.PyCF_ONLY_AST) 
     return True 
    except SyntaxError: 
     return False 

一定要执行该文件,因为如果你不能信任它的内容(如果你甚至不知道文件是否包含有效的语法,我怀疑你其实可以,如果你信任的内容,甚至生成它们),最终可能会执行恶意代码。

+0

仅供参考:'py_compile'也是[标准库](https://docs.python.org/2/library/py_compile.html)。 – Selcuk