さまざまな文字列を取り、それらをファイルに入れ、それが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
そしてこのoutputFile
True
False
しかし、python runTimeout.py でコードを実行すると、コンソールに何も出力されません。しかし、インタープリターを使って runTimeout.py の最後の 4 行のファイルを読み込むと、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)