Python 在exec()中访问自定义全局变量缺少什么?
在我的项目中,我有一些用户定义的小型python程序存储在我需要访问主程序中某些变量的文件中——我正在使用自定义全局列表通过Python 在exec()中访问自定义全局变量缺少什么?,python,Python,在我的项目中,我有一些用户定义的小型python程序存储在我需要访问主程序中某些变量的文件中——我正在使用自定义全局列表通过exec()。然而,虽然传递此列表中的函数似乎有效,但传递主程序的变量无效 主程序: lessonCorrect = False safeAccessForLessons = {'__builtins__':{}, 'print':print, 'lessonCorrect':lessonCorrect} try:
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是不安全的,谢谢。现在就更新这个例子。当你在做的时候,你还应该指定你期望的输出。如果您希望得到假、真、真
,我有一个坏消息。这确实是我所期望的输出,有什么问题吗?事实证明,这就是问题所在……非常感谢,现在一切正常。