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

Python - Replace function in exec and modules imported inside it

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

这是我要实现的示例:

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

有没有办法将新的全局变量、内置函数或变量列表传递给正在导入的模块?

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

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()
""")