我有一个包含Python函数的文本文件:
A.TXT
def func():
var = 5
return var
然后我用Python脚本读取这个文件:
b.py
python_file = open("a.txt").read()
现在我想将a.txt
文件的函数分配给变量,而不必担心函数名称并执行它。我试过这样的事情:
python_file = open("a.txt").read()
b = exec(python_file)
b()
但它没有用,我也试过execfile
。
答案 0 :(得分:2)
在您exec
字符串后,您可以直接调用func
,因为它已添加到您当前的命名空间中:
>>> exec("""def func():
var = 5 # note that the semicolons are redundant and unpythonic
return var""")
>>> func()
5
每{{}}} exec
实际上并没有返回任何内容,因此没有必要指定例如foo = exec(...)
。
要查看正在执行的代码中本地定义的名称,请将空字典作为exec
参数传递给locals
:
>>> ns = {}
>>> exec("""def func():
var = 5
return var""", globals(), ns)
>>> ns
{'func': <function func at 0x0315F540>}
然后您可以分配该功能并像平常一样调用它:
>>> b, = ns.values() # this will only work if only one name was defined
>>> b()
5
答案 1 :(得分:2)
在提供我的解决方案之前,我强烈反对这样做,除非您确定 a.txt 中没有恶意代码。
我的解决方案使用execfile
函数加载文本文件并返回第一个对象(可以是变量或函数):
def load_function(filename):
""" Assume that filename contains only 1 function """
global_var = dict()
execfile(filename, global_var)
del global_var['__builtins__']
return next(global_var.itervalues())
# Use it
myfunction = load_function('a.txt')
print myfunction()
要更加小心,请修改返回行,如下所示,以便跳过变量(但不能跳过类声明)。
return next(f for f in global_var.itervalues() if callable(f))
感谢johnsharpe指出Python 3中没有execfile
。这是一个使用exec
的修改后的解决方案。这次,该功能应该在“本地”范围内找到。
def load_function(filename):
""" Assume that filename contains only 1 function """
with open(filename) as f:
file_contents = f.read()
global_var = dict()
local_var = dict()
exec file_contents in global_var, local_var
return next(f for f in local_var.itervalues() if callable(f))
# Use it
myfunction = load_function('a.txt')
print myfunction()