2

再会!我正在尝试实现一个用于测试知识的模块。用户被赋予任务,他编写了正在发送并在服务器上执行的决策。下面的问题。文件中存储了原始数据。示例 - a = 5 b = 7 有一个自定义解决方案存储在字符串中。例子

s = a * b
p = a + b
print s,p

现在它全部作为字符串写在一个单独的文件中。

'a = 5\n', 'b = 7', u's = a * b\r\np = a + b\r\nprint s,p'

如何做到这一点,以便可以执行所使用的代码。会是这样的。

a = 5
b = 7
s = a * b
p = a + b
print s,p

这是我创建解决方案并在必要时执行它的功能。

def create_decision(user_decision, conditions):
    f1 = open('temp_decision.py', 'w')
    f = open(conditions, 'r+')
    contents = f.readlines()
    contents.append(user_decision)
    f1.write(str(contents))
    f1.close()
    output = []
    child_stdin, child_stdout, child_stderr = os.popen3("python temp_decision.py")
    output = child_stdout.read()
    return output

或者告诉我我做错了什么?谢谢!

4

2 回答 2

1

您不需要创建临时文件,只需使用exec. create_decision然后看起来像这样:

一个

def create_decision(user_decision, conditions):
    f = open(conditions, 'r+')
    contents = f.readlines()
    contents.append(user_decision)
    # join list entries with a newline between and return result as string
    output = eval('\n'.join(contents))
    return output

import sys
import StringIO
import contextlib

@contextlib.contextmanager
def stdoutIO(stdout=None):
    old = sys.stdout
    if stdout is None:
        stdout = StringIO.StringIO()
    sys.stdout = stdout
    yield stdout
    sys.stdout = old

def create_decision(user_decision, conditions):
    f = open(conditions, 'r+')
    contents = f.readlines()
    contents.append(user_decision)
    with stdoutIO() as output:
        #exec('\n'.join(contents)) # Python 3
        exec '\n'.join(contents) # Python 2
    return output.getvalue()

您还应该使用str.join()从条件列表中创建一个字符串。否则,您无法将其写入文件或执行它(我已经在上述函数中完成了此操作)。

编辑:我的代码中有一个错误(exec不返回任何内容),所以我添加了一个方法eval(但这不适用于 print,因为它评估并返回一个表达式的结果,更多信息在这里)。第二种方法捕获printstdoutIO来自另一个问题/答案(此处)的输出。此方法返回 print 的输出,但有点复杂。

于 2013-05-18T07:30:12.837 回答
0

你可以像这样执行一个字符串:exec("code")

于 2013-05-18T06:50:53.407 回答