2012-03-21 9 views
8

信じられないようなコードで作業しているとしたら、スクリプトの制御を失うことなく安全に実行できる方法はありますか?信頼できないコードを安全に実行するには?

例は、時間の一部しか動作せず、ランダム/壮観に失敗する可能性がある関数の場合がありますが、動作するまで再試行できますか?私はスレッドモジュールを使用していくつかのハッキングを試みましたが、ハングしたスレッドをきれいに殺すのに問題がありました。

#!/usr/bin/env python 

import os 
import sys 
import random 

def unreliable_code(): 

    def ok(): 
    return "it worked!!" 

    def fail(): 
    return "it didn't work" 

    def crash(): 
    1/0 

    def hang(): 
    while True: 
     pass 

    def bye(): 
    os._exit(0) 

    return random.choice([ok, fail, crash, hang, bye])() 


result = None 
while result != "it worked!!": 
    # ??? 
+5

コードがクラッシュする可能性はどうですか?あなた自身のコードと同じPythonインタプリタで実行するのも安全ですか?壊れたC拡張を使用する場合(または壊れていない拡張を使用する場合)、または潜在的にはPythonグローバルを変更する場合は、完全に異なるPythonインタプリタでサブプロセス内で実行する必要があります。 –

答えて

5

例外に対して安全に使用するには、try/exceptを使用します(ただし、わかっていると思います)。

コードをハンギング(無限ループ)するのを防ぐために、私が知っている唯一の方法は別のプロセスでコードを実行することです。この子プロセスは、すぐに終了しない場合、父プロセスから殺すことができます。

厄介なコード(それをしないでください)から安全になるためには、http://pypi.python.org/pypi/RestrictedPythonを見てください。

+3

PySandboxもあります - https://github.com/haypo/pysandbox/ – Darb

4

実際のケースでは、アプリケーションをマルチプロセッシングに切り替えることはできますか?あなたが求めているのは、multiprocessing + threading.Timer + try/exceptであると思われます。

これを見てください:1(幸運)の場合には私を与えたことを

class SafeProcess(Process): 
    def __init__(self, queue, *args, **kwargs): 
     self.queue = queue 
     super().__init__(*args, **kwargs) 
    def run(self): 
     print('Running') 
     try: 
      result = self._target(*self._args, **self._kwargs) 
      self.queue.put_nowait(result) 
     except: 
      print('Exception') 

result = None 
while result != 'it worked!!': 
    q = Queue() 
    p = SafeProcess(q, target=unreliable_code) 
    p.start() 
    t = Timer(1, p.terminate) # in case it should hang 
    t.start() 
    p.join() 
    t.cancel() 
    try: 
     result = q.get_nowait() 
    except queues.Empty: 
     print('Empty') 
    print(result) 

を:あなたがエラーを取得するために5回のチャンスのうち4つを持っているあなたのコードサンプルで

Running 
Empty 
None 
Running 
it worked!! 

を、正しい結果が得られる可能性を高めるためにプールなどを作成することもできます。

関連する問題