2012-01-26 4 views
1

Каков наилучший способ правильной финализации скрипта python при вызове sys.exit()?IronPython - правильное выделение ресурсов на sys.exit()

Например, у меня есть приложение, которое: - открытый файл журнала - открыл некоторые USB-гаджет - решить, что пришло время, чтобы закрыть приложение - вызов sys.exit (-1) - (или же он бросить суровым исключение - но я предпочитаю первый способ, поскольку я был маленьким поросенком, а некоторые части кода действительно улавливают все исключения, что остановит мое исключение прекращения ...)

Тогда мне понадобится функция finalize(), которая, несомненно, будет вызвана перед выходом из интерпретатора. Finalize() освободит USB-гаджет и закроет файл журнала именно в этом порядке.

Я попытался Защиту дель но не взывал sys.exit и, кроме того, я не могу решить, в каком порядке _ дель _s будет называться.

Есть ли какое-то спасение для меня? Или мне нужно сделать: 1. Наверху try-catch-finally 2. Делайте выход с каким-то конкретным исключением 3. всюду на каждом исключении поймайте точно, что я поймаю?

+1

Вы посмотрели на 'atexit'? http://docs.python.org/library/atexit –

ответ

1

См. Инструкцию with python.

class UsbWrapper(object): 
    def __enter__(self): 
     #do something like accessing usb_gadget (& acquire lock on it) 
     #usb_gadget_handle = open_usb_gadget("/dev/sdc") 
     #return usb_gadget_handle 

    def __exit__(self, type, value, traceback): 
     #exception handling goes here 
     #free the USB(lock) here 

with UsbWrapper() as usb_device_handle: 
     usb_device_handle.write(data_to_write) 

Независимо от того, генерирует ли код исключение или работает по желанию, замок USB всегда отпускается.

0

Ok я нашел ответ, который лучше всего подходящий для меня:

import sys 
try: 
    print "any code: allocate files, usb gadets etc " 
    try: 
    sys.exit(-1) # some severe error occure 
    except Exception as e: 
    print "sys.exit is not catched:"+str(e) 
    finally: 
    print "but all sub finallies are done" 
    print "shall not be executed when sys.exit called before" 
finally: 
    print "Here we can properly free all resources in our preferable order" 
    print "(ie close log file at the end after closing all gadgets)" 

за рекомендуемый atexit решения - это было бы хорошо и все, но это не работает в моем Python 2.6. Я попытался это:

import sys 
import atexit 

def myFinal(): 
    print "it doesn't print anything in my python 2.6 :(" 

atexit.register(myFinal) 

print "any code" 
sys.exit(-1) # is it pluged in? 
print "any code - shall not be execute" 

Как для Упаковочный решения - это, безусловно, наиболее фантазии - но, честно говоря, я не могу сказать, как это лучше ...

import sys 
class mainCleanupWrapper(object): 
    def __enter__(self): 
     print "preallocate resources optionally" 

    def __exit__(self, type, value, traceback): 
     print "I release all resources in my order" 

with mainCleanupWrapper() as whatsThisNameFor: 
     print "ok my unchaged code with any resources locking" 
     sys.exit(-1) 
     print "this code shall not be executed" 

Я нашел решение - но, честно говоря питон, кажется, быть довольно объемным и раздутым ...