如何将字符串转换为所需的形式?

时间:2013-05-18 06:46:01

标签: python string compilation strip-tags

美好的一天!我正在尝试实现一个用于测试知识的模块。用户被赋予任务,他写下了在服务器上发送和执行的决定。以下问题。存储在文件中的原始数据。示例 - 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

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

2 个答案:

答案 0 :(得分:1)

您无需创建临时文件,只需使用exec即可。 create_decision看起来如此:

<强> A

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,因为它评估并返回一个表达式的结果,更多信息here)。第二种方法捕获printstdoutIO的输出来自其他问题/答案(here)。此方法返回print的输出,但有点复杂。

答案 1 :(得分:0)

您可以执行如下字符串:exec("code")