Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何验证Python脚本的语法?_Python_Python 2.7_Validation_Syntax Error - Fatal编程技术网

如何验证Python脚本的语法?

如何验证Python脚本的语法?,python,python-2.7,validation,syntax-error,Python,Python 2.7,Validation,Syntax Error,我只想让我的Python脚本以最简单的方式询问“我刚才生成的Python代码在语法上是否有效?” 我试过: try: import py_compile x = py_compile.compile(generatedScriptPath, doraise=True) pass except py_compile.PyCompileError, e: print str(e) pass 但是,即使文件包含无效的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,也不会抛出异常,之后就不需要使用了。它的预期用途是从给定的源文件编写字节码文件。事实上,如果您没有在目录中写入的权限,它将失败,因此您可能最终会出现一些错误的否定

为了仅仅解析并验证语法,您可以使用模块来解析文件的内容,或者直接调用内置函数

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

请确保不要执行该文件,因为如果您不能信任其内容(如果您甚至不知道该文件是否包含有效语法,我怀疑即使您生成了这些内容,您也不能真正信任这些内容),您可能会执行恶意代码。

您是否可以尝试导入生成的模块并捕获ImportError(如果模块丢失)或SyntaxError(如果模块无效)?或者,
ast.parse
在解析无效Python代码时会引发异常。无效Python是什么意思?如果您只想解析模块,可以使用模块的函数。事实上,有一个内置函数可以用来实现这一点。@Rogalski是的。。。如果那个文件是用户提供的并且包含恶意代码呢?这给了我一个例外。您对“无效Python代码”做了哪些尝试?仅供参考:
py_compile
也是一个示例。