如何解决为什么 Flask 路由函数没有从 exec(open('pythonscript.py').read() 获取正确的变量更改?
所以,我有一个这样的烧瓶路线功能
@app.route('/process_run',methods=['GET','POST'])
def process_run():
file_str_cnt = 0
exec(open('pythonscript.py').read())
return render_template('process.html',file_str_cnt=file_str_cnt)
pythonscript.py:
for i in range(10):
file_str_cnt += 1
process.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Success</title>
</head>
<body onload="verify_parse()">
</body>
<script>
function verify_parse() {
confirm("file_str_cnt value "+{{ file_str_cnt|tojson }})
}
</script>
</html>
当我运行 Flask 应用程序时,file_str_cnt 变量在确认弹出窗口中显示为 0(当它真的应该是 10 时)。知道为什么 pythonscript.py 中的增量不影响 process_run() 函数。如果是,我可以通过什么方式实现这一目标? (还请注意:如果我将 pythonscript.py 脚本放在没有 exec() 函数的路由函数中,这将起作用。我希望它与 exec() 函数一起使用。)>
解决方法
file_str_cnt
是 process_run
函数内的局部变量。每documentation:
如果您需要在函数 exec()
返回后查看代码对 locals 的影响,请传递一个显式的 locals 字典。
因此,您可以通过这种方式修复您的代码(隔离在一个独立的示例中,适应路由是微不足道的):
code = """
for i in range(10):
file_str_cnt += 1
"""
def process_run():
local_vars = { "file_str_cnt": 0 }
exec(code,globals(),local_vars)
return local_vars["file_str_cnt"]
print(process_run())
# => 10
甚至
def process_run():
file_str_cnt = 0
local_vars = locals()
exec(code,local_vars)
return local_vars["file_str_cnt"]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。