在我的项目中,我有一些小的用户定义的python程序存储在我需要访问主程序中的一些变量的文件中 - 我通过exec()
运行这些变量并使用自定义全局列表(以最小化恶意代码运作的能力)。但是,虽然传递此列表中的函数似乎有效,但传递主程序的变量并不起作用。
主程序:
lessonCorrect = False
safeAccessForLessons = {'__builtins__':{}, 'print':print,
'lessonCorrect':lessonCorrect}
try:
exec("""
print('Found!')
x = 3
y = 4
print(x,y,x+y,x*y)
global lessonCorrect
print(lessonCorrect)
lessonCorrect = True
print(lessonCorrect)""", safeAccessForLessons)
print(lessonCorrect)
except:
print("Blah")
import sys
print(sys.exc_info())
输出:
>>> checkLesson()
Found!
3 4 7 12
False #First print in file
True #Second print in file
False #Print in function
预期产出:
>>> checkLesson()
Found!
3 4 7 12
<unimportant> #First print in file
True #Second print in file
True #Print in function
答案 0 :(得分:1)
此处的问题不在于exec
,而在于您访问lessonCorrect
变量的方式。
例如见:
lessonCorrect = False
safeAccessForLessons = {'lessonCorrect': lessonCorrect}
safeAccessForLessons['lessonCorrect'] = True
print('dict', safeAccessForLesssons)
print('var', lessonCorrect)
这将输出:
dict {'lessonCorrect': True}
var False
所以,为了回到你的代码,这里exec
调用正在修改safeAccessForLessons
dict,但是永远不会触及lessonCorrect变量。因此,您可以print(lessonCorrect)
执行checkLesson
,而不是print(safeAccessForLesssons['lessonCorrect'])
{{1}},而您将得到您想要的内容