You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

__future__模块在exec函数中无法持续生效的技术咨询

关于exec中__future__模块作用域的疑问

我希望在exec函数中使用__future__模块,却发现它仅在当前exec调用中生效,后续的exec调用无法继承其效果。以下代码展示了该问题:只有第二次导入__future__模块后,输出的'hello world'才符合预期,请问我是否遗漏了什么配置?

>>> ns = {} 
>>> exec("from __future__ import print_function", ns) 
>>> exec("print('hello', 'world')", ns) 
('hello', 'world') 
>>> exec("from __future__ import print_function\nprint('hello', 'world')", ns)
hello world

解答

这其实是Python设计上的既定规则啦,__future__的导入本身就只对当前代码块/执行上下文生效,不管是在脚本里还是exec调用里都是如此。

原因很简单:__future__的导入本质是给解释器发一个「编译指令」,告诉它要启用特定的语法或行为模式。而每个exec调用都会被Python当作独立的编译单元来处理——也就是说,第一个exec里的编译指令,完全不会影响第二个exec代码的编译过程,所以第二个exec还是会用Python的默认行为(把print的多个参数当成元组打印)。

哪怕你第一个exec已经把print_function导入到了命名空间ns里也没用,因为__future__的作用是在编译阶段生效,不是运行阶段,命名空间里的模块对象改变不了后续代码的编译规则。

给你两个可行的解决办法:

  • 把相关代码放在同一个exec调用里:如果可以的话,把__future__导入和需要用到新特性的代码写在同一段字符串里,这样编译时就会启用对应的特性:
    ns = {}
    exec("from __future__ import print_function\nprint('hello', 'world')", ns)
    
  • 每个需要特性的exec都重新导入__future__:如果必须拆分多个exec调用,那每个要用到新特性的exec开头都得重新写from __future__ import xxx,这不是你遗漏了配置,而是必须的操作。

内容的提问来源于stack exchange,提问作者zjffdu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:10:40