IronPython - sys.exit()上的适当资源释放

时间:2012-01-26 17:29:10

标签: python ironpython finalize

调用sys.exit()时正确完成python脚本的最佳方法是什么?

例如,我有一个应用程序:   - 打开日志文件   - 打开一些USB小工具   - 决定关闭应用程序的时间      - 调用sys.exit(-1)      - (或者它会抛出严厉的异常 - 但我更喜欢第一种方式,因为我的小猪和代码的某些部分实际上捕获了所有异常,这将阻止我的终止异常......)

然后我需要一些finalize()函数,在退出解释器之前肯定会调用它。 Finalize()将按照此顺序释放USB小工具并关闭日志文件。

我尝试了def del ,但是没有在sys.exit上调用它,而且我无法决定调用_ del _s的顺序。

我有救恩吗?或者我必须这样做: 1.最重要的尝试 - 最终 2.使用某些特定的Exception执行退出 3.每个异常捕获的每个地方都准确指出我正在捕捉的内容?

2 个答案:

答案 0 :(得分:1)

请参阅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锁定。

答案 1 :(得分:0)

好的,我找到了最适合我的答案:

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" 

我找到了解决办法 - 但坦率地说,蟒蛇似乎变得笨重而臃肿......