下面给exec
的代码将在没有编译错误的情况下传递,但会在“error”语句中导致运行时错误:
globs = {}
exec('''
def main():
print('Hello Python')
error # Makes run-time error
''', globs)
globs['main']()
错误消息是:
Traceback (most recent call last): File "C:\work\sandbox.py", line 11, in globs['main']() File "<string>", line 4, in main NameError: name 'error' is not defined
仅File "<string>", line 4, in main
的位置信息不是很有用,例如在尝试找到可以来自文件的代码的来源时。
请注意,以上是显示问题的简化示例。在实际程序中,代码定义了在主程序中不同位置执行的几个函数。
是否有某种方法可以将exec
中的代码提供给“&lt; string&gt;”以外的其他位置,如果exec代码中出现异常,则会显示其他位置?
答案 0 :(得分:5)
你可以先compile
你的代码并给它一个文件名参数:
code = compile('error', 'foo.py', 'exec')
exec(code)
输出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo.py", line 1, in <module>
NameError: name 'error' is not defined
答案 1 :(得分:0)
将您exec
的代码写入文件,并run it。
或者更好的是,首先接受来自文件的代码输入。这可能更安全,并使代码更容易审核。如果需要该功能,它还使用户更容易在以后更改它。
您应该避免将exec
用于您无法控制的代码 - 这非常危险。除非您编写程序生成的代码,否则没有理由使用它。