我正在尝试编写一个 python 函数,它将接受不同的字符串并将它们放入一个文件中,这样它将成为一个 python 文件。然后它将使用另一个 python 实例运行这个 python 文件。我希望这个过程在指定的时间后超时 - 例如在无限循环的情况下。这是代码:
# runTimeout.py
input_value = "x = addTwo(1,2)\n"
expected_output = "x == 3"
solution = "def addTwo(a, b):\n\treturn a+b"
timeout = 0.1
# Create the test file by adding (1)submission.solution (2)input_value (3)if (4)expected_output (5): (6) return True (6) return False
inputFile = solution + "\n" + input_value + "\n" + "if " + expected_output + ":" + "\n" + "\t" + "print True" + "\n" + "print False"
fin = open('inputfile', 'w')
fin.write(inputFile)
fin.close()
command = "python ~/Dropbox/django/inputFile > ~/Dropbox/django/outputFile"
def runTimeout(command, timeout):
import os, signal, time, commands
cpid = os.fork()
if cpid == 0:
while True:
commands.getstatusoutput(command)#[1].split('\n')
else:
time.sleep(timeout)
os.kill(cpid, signal.SIGKILL)
return
runTimeout(command, timeout)
fout = open('outputFile', 'r')
for line in fout:
print line
fout.close()
它正确地生成了这个 inputFile:
def addTwo(a, b):
return a+b
x = addTwo(1,2)
if x == 3:
print True
print False
和这个输出文件
True
False
但是当我使用 python runTimeout.py 执行代码时,控制台上没有任何内容。但是,当我使用解释器读出带有最后四行 runTimeout.py 的文件时,我得到了 outputFile 的内容。这是怎么回事?我不明白为什么相同的代码可以同时工作,但不能在另一个地方工作。
在我让它独立工作后,我打算把它放到一个 django 函数中。
- 更新 -
Brandon 的解决方案有所帮助,但由于某种原因,它似乎无法在终端上始终如一地工作 - 有时它会打印 True,有时它什么也不打印。
我写了这个新代码,当它是一个单独的 python 文件时它可以工作。在 Django 函数中它在 signal.signal(signal.SIGALRM, signal_handler) 上失败(500 内部服务器错误)
command = "python ~/Dropbox/django/testcode/inputFile > ~/Dropbox/django/testcode/outputFile"
import signal, subprocess
def signal_handler(signum, frame):
raise Exception("Timed out!")
signal.signal(signal.SIGALRM, signal_handler) #fails here
signal.alarm(timeout)
results = ""
try:
subprocess.call(command, shell=True)
fout = open('outputFile', 'r')
for line in fout:
print line
results += line
fout.close()
except Exception:
print "Failure."
signal.alarm(0)
print "results = " + str(results)