2

我想使用pysandbox允许用户在我的服务器上运行代码。我将 Django 的内部服务器(manage.py runserver)与这个请求处理程序一起使用:

def try_sandbox(request):
    from sandbox import Sandbox
    def func(a, b):
        return a + b
    sandbox = Sandbox()
    result = sandbox.call(func, 1, 2)
    return HttpResponse(result)

访问页面时出现 ValueError:

Request Method: GET
Exception Type: ValueError
Exception Value:   signal only works in main thread
Exception Location: /Library/Python/2.7/site-packages/sandbox/timeout.py in limitedTime, line 45
Python Executable:  /usr/bin/python

Traceback:

Django Version: 1.3.1
Python Version: 2.7.1
File "[...]views.py" in try_sandbox
  77.     result = sandbox.call(func, 1, 2)
File "/Library/Python/2.7/site-packages/sandbox/sandbox_class.py" in call
  44.         return self._call(func, args, kw)
File "/Library/Python/2.7/site-packages/sandbox/sandbox_class.py" in _call
  31.                 return limitedTime(timeout, func, *args, **kw)
File "/Library/Python/2.7/site-packages/sandbox/timeout.py" in limitedTime
  45.             old_alarm = signal(SIGALRM, signalHandler)

是否可以在这种环境下使用 pysandbox?

(我想我正在使用 pysandbox 1.1 - 这就是下载中的 version.py 所说的。下载文件夹显示 1.0.1。我正在运行 Mac OS 10.7.2。)

4

1 回答 1

2

我自己没有遇到过这个错误,所以我可能完全错了——但如果 pysandbox 不喜欢在非主线程上运行,那么你应该确保它在主线程上运行。如果您查看django runserver 文档,似乎在 django 的开发版本中引入了 --nothreading 选项。如果这是你正在运行的,那么它可能值得一试。例如:

manage.py runserver --nothreading

或者,如果您仍然无法使其正常工作(并且不介意这个想法可能非常低效),您可以使用subprocess.check_output或类似方法生成一个单独的进程,然后从那里运行您的沙盒代码。由于各种原因,这确实不是一个绝妙的主意,但肯定会导致沙箱代码从主线程运行。

于 2011-12-13T21:51:02.450 回答