在exec()中访问自定义全局变量时我错过了什么?

时间:2018-03-20 09:39:20

标签: python

在我的项目中,我有一些小的用户定义的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

1 个答案:

答案 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}},而您将得到您想要的内容