2011-12-06 11 views
2

pysandboxを使用して、ユーザーが自分のサーバーでコードを実行できるようにします。私はこの要求ハンドラでDjangoの内部サーバ(manage.pyのrunserver)を使用しています: Djangoリクエストハンドラでpysandboxを使用するにはどうすればよいですか?

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を実行しているよ。。。)

+1

環境をより詳しく記述してください。どのWebサーバーを使用していますか? Python 2.6.6 x64、Django 1.3.0、pysandbox 1.0.3では、django内部サーバ(manage.py runserver)との例外なく動作します。 – utapyngo

+0

@utapyngo私はいくつかの情報を追加しました。私は、今日後で非マスターpysandboxブランチを試みます。 – fgm2r

+0

少なくとも、完全な詳細なエラーメッセージを貼り付けてください。 –

答えて

2

私はこのエラーに遭遇していないので絶対に間違っているかもしれませんが、pysandboxがメインではないスレッドで実行したくない場合は、メインスレッドで実行されていることを確認する必要があります。 django runserver documentationを見ると、開発バージョンのdjangoに--nothreadingオプションが導入されたようです。これがあなたが走っているものなら、それはチェックアウトの価値があるかもしれません。また

manage.py runserver --nothreading 

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

+0

私は開発版をインストールして--nothreadingを使用しましたが、違いはありません。必要に応じて別のプロセスを使用することがあります。 (私はたくさんの小さなコードを実行して多くのプロセスを作成するか、システム全体をサンドボックスで実行する必要があります)。 – fgm2r

関連する問題