美好的一天!我正在尝试实现一个用于测试知识的模块。用户被赋予任务,他写下了在服务器上发送和执行的决定。以下问题。存储在文件中的原始数据。示例 - 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
或者告诉我我做错了什么?谢谢!
答案 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)。第二种方法捕获print
和stdoutIO
的输出来自其他问题/答案(here)。此方法返回print的输出,但有点复杂。
答案 1 :(得分:0)
您可以执行如下字符串:exec("code")