如何检查字符串是否为有效的python代码(运行时错误)

时间:2019-03-27 14:22:09

标签: python python-3.x abstract-syntax-tree

是否可以检查运行时错误?从字符串中可以明显看出pri1nt是一个函数,并且未在此字符串中定义。

import ast

def is_valid_python(code):
  try:
     ast.parse(code)
  except SyntaxError:
     return False
  return True

mycode = 'pri1nt("hello world")'

is_valid_python(mycode) # true

exec(mycode) # NameError: name 'pri1nt' is not defined

2 个答案:

答案 0 :(得分:1)

尝试使用BaseException代替SyntaxError。这将检查每种类型的python错误,包括NameError。另外,由于ast.parse永远不会出现任何错误,因此应该改用exec

所以应该像这样:

def is_valid_python(code):
  try:
     exec(code)
  except BaseException:
     return False
  Return True

mycode = 'pri1nt("hello world")'

is_valid_python(mycode) # false

答案 1 :(得分:0)

也许是这样吗?

import subprocess

script_string = "prnt(\"Hello World!\")"    
proc = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
res = proc.communicate(bytes(script_string, "UTF-8"))

它的基本作用是将字符串通过管道传递给python解释器。如果没有错误,则script_string有效。

编辑:res将包含(stdout_data, stderr_data)(请参阅https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate