调用sys.exit()时正确完成python脚本的最佳方法是什么?
例如,我有一个应用程序: - 打开日志文件 - 打开一些USB小工具 - 决定关闭应用程序的时间 - 调用sys.exit(-1) - (或者它会抛出严厉的异常 - 但我更喜欢第一种方式,因为我的小猪和代码的某些部分实际上捕获了所有异常,这将阻止我的终止异常......)
然后我需要一些finalize()函数,在退出解释器之前肯定会调用它。 Finalize()将按照此顺序释放USB小工具并关闭日志文件。
我尝试了def del ,但是没有在sys.exit上调用它,而且我无法决定调用_ del _s的顺序。
我有救恩吗?或者我必须这样做: 1.最重要的尝试 - 最终 2.使用某些特定的Exception执行退出 3.每个异常捕获的每个地方都准确指出我正在捕捉的内容?
答案 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"
我找到了解决办法 - 但坦率地说,蟒蛇似乎变得笨重而臃肿......