<div class="gmail_quote">On 1 February 2012 09:02, Peter Otten <span dir="ltr"><__<a href="mailto:peter__@web.de">peter__@web.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">Prasad, Ramit wrote:<br>> Is that true even in the face of something like sys.exit()?<br>
> What happens if 1) sys.exit is called while in the same thread<br>
> 2) sys.exit is called from another thread but while this thread<br>
> is in context manager?<br>
<br>
</div>sys.exit() uses the normal exception mechanism to terminate a program:<br>
<br>
>>> import sys<br>
>>> try:<br>
...     sys.exit()<br>
... except SystemExit:<br>
...     print "I'd rather not"<br>
...<br>
I'd rather not<br>
>>><br>
<br>
It won't derail a context manager:<br>
<br>
>>> from contextlib import contextmanager<br>
>>> @contextmanager<br>
... def f():<br>
...     try:<br>
...             yield<br>
...     finally: print "bye"<br>
...<br>
>>> import sys<br>
>>> with f():<br>
...     sys.exit()<br>
...<br>
bye<br>
$</blockquote><div> </div><div>Note OTOH that os._exit() just terminates the process with no cleanup (this may be what you were thinking of):</div><div><br></div><div>>>> from contextlib import contextmanager</div>
<div>>>> @contextmanager</div><div>... def f():</div><div>...     try:</div><div>...             yield</div><div>...     finally: print "bye"</div><div>...</div><div>>>> import os</div><div>>>> with f():</div>
<div>...     os._exit(1)</div><div>...</div><div>$ </div><div><br></div><div>Tim Delaney</div></div>