IronPython - правильное освобождение ресурсов в sys.exit () - PullRequest
1 голос
/ 26 января 2012

Каков наилучший способ правильно завершить скрипт Python при вызове sys.exit ()?

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

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

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

Есть ли какое-то спасение для меня? Или я должен сделать: 1. Топ самых успешных 2. Сделайте выход с каким-то конкретным исключением 3. везде на каждое исключение поймать указать, что именно я ловлю?

Ответы [ 2 ]

1 голос
/ 26 января 2012

См. Оператор Python with.

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 голосов
/ 27 января 2012

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

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"

Что касается решения Wrapper - оно определенно самое модное - но, честно говоря, я не могу сказать, как оно лучше ...

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" 

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

...