Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 沙盒外壳程序按时完成_Python_Shell_Sandbox - Fatal编程技术网

Python 沙盒外壳程序按时完成

Python 沙盒外壳程序按时完成,python,shell,sandbox,Python,Shell,Sandbox,我正在为一个Python编程课程编写一个评分机器人,学生的提交可能会无限循环。我想对他们的程序执行一个shell调用,这样它的运行时间就不会超过特定的时间。我想跑步,比如说 restrict --msec=100 --default=-1 python -c "while True: pass" 如果程序运行时间超过100ms,则返回-1,否则返回已执行表达式的值(在本例中为python程序的输出) Python内部是否支持这一点?我也在用Perl编写分级机器人,因此我可以使用一些围绕shel

我正在为一个Python编程课程编写一个评分机器人,学生的提交可能会无限循环。我想对他们的程序执行一个shell调用,这样它的运行时间就不会超过特定的时间。我想跑步,比如说

restrict --msec=100 --default=-1 python -c "while True: pass"
如果程序运行时间超过100ms,则返回-1,否则返回已执行表达式的值(在本例中为python程序的输出)

Python内部是否支持这一点?我也在用Perl编写分级机器人,因此我可以使用一些围绕shell脚本调用的Perl模块。

用于调用学生函数(
foo
,在下面的示例中)。如果在0.1秒或更短时间内返回,则使用带超时的获取结果,否则
get
引发超时错误:

import multiprocessing as mp
import time
import sys

def foo(x):
    time.sleep(x)
    return x*x

pool = mp.Pool(1)

for x in (0.01, 1.0):
    try:
        result = pool.apply_async(foo, args = (x,)).get(timeout = 0.1)
    except KeyboardInterrupt:
        pool.terminate()
        sys.exit("Cancelled")
    except mp.TimeoutError:
        print('Timed out')
    else:
        print "Result: {r}".format(r = result)

或者,如果学生提交脚本而不是函数,那么您可以使用。

标准方法是执行以下操作

  • 创建一个子流程,在学生自己的Python实例中运行学生的程序

  • 等一会儿

  • 如果学生子进程退出,则很好

  • 如果子进程尚未退出,则需要终止它


  • 下载允许对子流程进行每个状态检查的模块时,您会非常高兴。

    了解python很好,但我最终使用了一个脚本,该脚本允许我在不增加python开销的情况下执行操作: