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 documentationを見ると、開発版のdjangoに --nothreading オプションが導入されているようです。これがあなたが実行しているものである場合は、チェックアウトする価値があるかもしれません. 例えば:

manage.py runserver --nothreading

または、それでも動作しない場合 (そして、このアイデアがおそらく非常に非効率的であることを気にしないでください) 、 subprocess.check_outputなどを使用して別のプロセスを生成し、そこからサンドボックス化されたコードを実行することができます。これは、さまざまな理由から素晴らしいアイデアではありませんが、サンドボックス コードがメイン スレッドから実行されることは間違いありません。

于 2011-12-13T21:51:02.450 に答える