我想使用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。)
答案 0 :(得分:2)
我自己没有遇到过这个错误所以我可能完全错了 - 但是看起来如果pysandbox不喜欢在非主线程上运行那么你应该确保它在主线程上运行。如果查看django runserver documentation,似乎在django的开发版本中引入了--nothreading选项。如果这是您正在运行的,那么可能值得一试。例如:
manage.py runserver --nothreading
或者,如果你仍然无法使它工作(并且不介意这个想法可能非常低效)你可以使用subprocess.check_output或类似的方法产生一个单独的进程,并运行你的沙盒代码那里。由于各种原因,这确实不是一个好主意,但肯定会导致沙箱代码从主线程运行。