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

2024-09-28 23:53:56 发布

您现在位置: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

Tags: in程序falsetrue列表sysfilefirst
1条回答
网友
1楼 · 发布于 2024-09-28 23:53:56

这里的问题不在于exec,而在于如何访问lessonCorrect变量

比如说:

lessonCorrect = False
safeAccessForLessons = {'lessonCorrect': lessonCorrect}
safeAccessForLessons['lessonCorrect'] = True
print('dict', safeAccessForLesssons)
print('var', lessonCorrect)

这将输出:

dict {'lessonCorrect': True}
var False

因此,为了回到您的代码,这里的exec调用修改了safeAccessForLessonsdict,但从未触及lessonCorrect变量。因此,您不必在checkLesson中执行print(lessonCorrect),而可以执行print(safeAccessForLesssons['lessonCorrect']),您将得到您想要的

相关问题 更多 >