2016-03-04 69 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