Python读写文件错误

时间:2013-01-28 23:01:50

标签: python django

我正在尝试编写一个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的文件时,我得到了outputFile的内容。这是怎么回事?我无法弄清楚为什么同一个代码同时工作,而不是另一个。

我打算在把它独立工作后把它放到django函数中。

- 更新 -

布兰登的解决方案有所帮助,但出于某种原因,它似乎从终端不能始终如一地工作 - 有时,它打印出True,有时它什么都不打印。

我编写了这个新代码,当它是一个单独的python文件时可以工作。 在Django函数内部在signal.signal上失败(500内部服务器错误)(signal.SIGALRM,signal_handler)

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)

1 个答案:

答案 0 :(得分:0)

我认为您应该等到子进程退出,这会使您的代码看起来像这样

def runTimeout(command, timeout):
    import os, signal, time, subprocess
    cpid = os.fork()
    if cpid == 0:
        while True:
            subprocess.call(command, shell=True)
        os._exit(0)
    else:
        time.sleep(timeout)
        os.kill(cpid, signal.SIGKILL)
    os.waitpid(cpid, 0)
    return