Python-exec的使用和遇到的问题

背景描述:

        在项目中,需要动态编辑python脚本,动态执行。exec方法可以动态的执行脚本代码

遇到的问题:

        在脚本代码中,定义了多个方法,多个方法存在相互调用关系。将脚本放在exec方法中执行时,被嵌套执行的方法编译报错,错误提示:NameError: name 'b' is not defined

代码实例如下:

code = '''
def b(x):
    print(x)
    
def a(x):
    b(x)
    
a(x)
# '''

params = {
    'x': 1
}

exec(code, None, params)

问题排查:

        在方法a中,使用globals()和locals()查看全局和局部定义的内容,代码如下:

code = '''
def b(x):
    print(x)
    
def a(x):
    # print()
    print('*'*20)
    print(globals())
    print('*'*20)
    print(locals())
    b(x)
    
a(x)
# '''

params = {
    'x': 1
}


exec(code, None, params)
// globals 

{
    '__name__': '__main__',
    '__doc__': None,
    '__package__': None,
    '__loader__': < _frozen_importlib_external.SourceFileLoader object at 0x108f7aca0 > ,
    '__spec__': None,
    '__annotations__': {},
    '__builtins__': < module 'builtins' (built - in ) > ,
    '__file__': '/Users/andrew/PycharmProject/demos/exec_demo.py',
    '__cached__': None,
    'code': "\ndef b(x):\n    print(x)\n    \ndef a(x):\n    # print()\n    print('*'*20)\n    print(globals())\n    print('*'*20)\n    print(locals())\n    b(x)\n    \na(x)\n# ",
    'params': {
        'x': 1,
        'b': < function b at 0x108fc51f0 > ,
        'a': < function a at 0x109062d30 >
    }
}

// locals

{

        'x': 1

}

发现方法b并没有被注册在全局上下文中。编译器在解释代码时,并不知道方法是否被嵌套使用,因此从全局获取。

解决思路:

将b注册在全局中,代码如下所示:

code = '''
def b(x):
    print(x)
    
def a(x):
    b(x)
    
a(x)
# '''

params = {
    'x': 1
}


exec(code, params, None)

欢迎大家留言交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andrew-ZhangJinyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值