Python-替换exec中的函数和其中导入的模块

时间:2018-06-26 10:45:33

标签: python python-3.x exec python-import

我想替换用exec运行的代码中的一些内置函数。可以通过将其作为第二个exec参数中的字典条目来传递。但是,当我尝试在执行的代码中导入模块时,在导入的模块内部调用时,功能与原始公告相同。

这是我要达到的目标的示例:

from inspect import cleandoc


def new_print(val):
    print('Hello', val)

code_inner = cleandoc("""
    def bar():
        print('Inner')
""")

with open('inner.py', 'w') as f:
    f.write(code_inner)

code_outer = cleandoc("""
    import inner
    print('Outer')
    inner.bar()
""")

exec(code_outer, {'print': new_print}, {})

这是我收到的回复:

Hello Outer
 Inner

这就是我想要的:

Hello Outer
Hello Inner

是否有任何方法可以将新的全局变量,内置函数或变量列表传递给导入的模块?

1 个答案:

答案 0 :(得分:0)

我不确定这是否正是您想要的,但是将字典参数传递给该函数并更新其模块全局变量是可以的。

code_inner = cleandoc("""
    def bar(d):
        globals().update(d)
        print('Inner')
""")


code_outer = cleandoc("""
    import inner
    print('Outer')
    inner.bar({'print': print})
""")

或者,无需修改bar功能,您可以将其模块传递给全局,如下所示:

code_outer = cleandoc("""
    import inner
    inner.print = print
    print('Outer')
    inner.bar()
""")