2012-03-21 16 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

बस कोड क्रैश कैसे शानदार हो सकता है? क्या यह एक ही पायथन दुभाषिया में अपने कोड के रूप में चलाने के लिए भी सुरक्षित है? यदि यह टूटे हुए सी एक्सटेंशन (या गैर-टूटे हुए लोगों का दुरुपयोग) का उपयोग करता है, या संभवतः पाइथन ग्लोबल्स को संशोधित करता है, तो आपको इसे उपप्रोसेसर में पूरी तरह से अलग पायथन दुभाषिया में चलाने की आवश्यकता हो सकती है। –

उत्तर

4

आप इसे sandbox में चलाने का प्रयास कर सकते हैं।

5

अपवादों के खिलाफ सुरक्षित होने के लिए, कोशिश करें/छोड़कर (लेकिन मुझे लगता है कि आप इसे जानते हैं) का उपयोग करें।

फांसी कोड (अंतहीन पाश) के खिलाफ सुरक्षित होने के लिए मुझे पता है कि एकमात्र तरीका कोड को दूसरी प्रक्रिया में चला रहा है। इस बच्चे की प्रक्रिया में आप पिता प्रक्रिया से मार सकते हैं यदि यह जल्द ही समाप्त नहीं होता है।

खराब कोड (जो कुछ भी नहीं करेगा) के खिलाफ सुरक्षित होने के लिए, http://pypi.python.org/pypi/RestrictedPython पर एक नज़र डालें।

+3

PySandbox भी है - https://github.com/haypo/pysandbox/ – Darb

4

आपके असली मामले में आवेदन आप मल्टीप्रोसेसिंग पर स्विच कर सकते हैं? ऐसा लगता है कि आप जो पूछ रहे हैं वह multiprocessing + threading.Timer + try/except के साथ किया जा सकता है।

इस पर एक नज़र डालें:

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) 

यह एक (भाग्यशाली) मामले में मुझे दिया:

Running 
Empty 
None 
Running 
it worked!! 

यदि आपको कोई त्रुटि प्राप्त करने के लिए 5 में से 4 अवसर अपने कोड नमूने में, इसलिए आप एक सही परिणाम होने की संभावनाओं को बेहतर बनाने के लिए पूल या कुछ भी पैदा कर सकते हैं।

संबंधित मुद्दे