从文本文件中读取python函数并将其赋值给变量

时间:2015-08-10 12:56:14

标签: python python-3.x python-3.4

我有一个包含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

2 个答案:

答案 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))

更新2

感谢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()