Python 如何执行inspect.getsource返回的代码

Python 如何执行inspect.getsource返回的代码,python,python-3.x,metaprogramming,node-inspector,code-inspection,Python,Python 3.x,Metaprogramming,Node Inspector,Code Inspection,我正在使用python,从函数调用inspect.getsource(func) 我想执行代码并获取函数的返回值 以下是我目前掌握的代码: def f(): a = 1 v = 2 return 1 import inspect st = inspect.getsource(f) b = exec(st) print(b) 但目前我看到了下面显示的输出 没有 我错过了什么?我希望它能够执行函数并返回它应该提供的返回值,就像我只是调用函数一样 欢迎您的提示和建议。exe

我正在使用python,从函数调用
inspect.getsource(func)

我想执行代码并获取函数的返回值

以下是我目前掌握的代码:

def f():
    a = 1
    v = 2
    return 1

import inspect
st = inspect.getsource(f)
b = exec(st)
print(b)
但目前我看到了下面显示的输出

没有

我错过了什么?我希望它能够执行函数并返回它应该提供的返回值,就像我只是调用函数一样


欢迎您的提示和建议。

exec
不会返回任何内容。您可以这样为其指定某些内容:

def f():
    a = 1
    v = 2
    return 1

import inspect
st = inspect.getsource(f) + '\nret=f()'
exec(st)
print(ret)  # prints 1
这是另一个选择,但它非常丑陋

In [65]: def f():
    ...:     a = 1
    ...:     v = 2
    ...:     return 1
    ...:

In [66]: def my_exec(func):
    ...:     try:
    ...:         code = inspect.getsource(func)
    ...:         func_name = func.__name__
    ...:         exec('global ret\n{}\nret={}()'.format(code, func_name))
    ...:         global ret
    ...:         return ret
    ...:     except IOError:
    ...:         return None
    ...:

In [67]: my_exec(f)
Out[67]: 1

这将创建一个全局的,
ret
,定义函数,然后运行函数,将返回值分配给
ret
。最后,它返回
ret
包含的任何内容。通过定义自己的
exec
函数,您可以更好地控制之前/之后发生的事情。

如果您有对该函数的引用,则只需调用该函数-检索该函数的源代码,然后重新编译它,很可能会生成一个不工作(或至少不等效)的函数,由于全局环境不同于包含原始函数的模块。@jasonharper-我需要函数的代码,并且能够执行它,我很好奇,你需要它做什么?有没有其他解决方案来执行从inspect返回的东西?@thebeancounter我给出了另一个例子来定义你自己的exec方法。你有什么特别想要的吗?刚刚发现dill解决这个问题容易多了,你想改变你的答案来使用它吗?模拟负载(模拟转储(功能))()