Python 在exec()中访问自定义全局变量缺少什么?

Python 在exec()中访问自定义全局变量缺少什么?,python,Python,在我的项目中,我有一些用户定义的小型python程序存储在我需要访问主程序中某些变量的文件中——我正在使用自定义全局列表通过exec()。然而,虽然传递此列表中的函数似乎有效,但传递主程序的变量无效 主程序: lessonCorrect = False safeAccessForLessons = {'__builtins__':{}, 'print':print, 'lessonCorrect':lessonCorrect} try:

在我的项目中,我有一些用户定义的小型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
>>检查课程()
建立
3 4 7 12
#文件中的首次打印
True#文件中的第二次打印
True#打印功能

这里的问题不在于
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变量。因此,您不必在
checkLesson
中执行
print(lessonCorrect)
,而可以执行
print(safeaccessforlessons['lessonCorrect'])
操作,这样您就可以得到您想要的内容了。

另外,我无法重现您的输出。我得到了预期的
False、True、False
。请发布-删除从文件中读取文本的代码,并将文件内容放入代码中。最后,我们应该通过复制代码并执行它来获得与您相同的输出。@Aran Fey我知道exec和eval是不安全的,谢谢。现在就更新这个例子。当你在做的时候,你还应该指定你期望的输出。如果您希望得到
假、真、真
,我有一个坏消息。这确实是我所期望的输出,有什么问题吗?事实证明,这就是问题所在……非常感谢,现在一切正常。