ipy_signals.py
61 lines
| 1.7 KiB
| text/x-python
|
PythonLexer
vivainio
|
r477 | """ Advanced signal (e.g. ctrl+C) handling for IPython | |
So far, this only ignores ctrl + C in IPython file a subprocess | |||
is executing, to get closer to how a "proper" shell behaves. | |||
Other signal processing may be implemented later on. | |||
If _ip.options.verbose is true, show exit status if nonzero | |||
""" | |||
vivainio
|
r480 | import signal,os,sys | |
Brian Granger
|
r2027 | from IPython.core import ipapi | |
vivainio
|
r477 | import subprocess | |
Brian Granger
|
r2027 | ip = ipapi.get() | |
vivainio
|
r477 | ||
vivainio
|
r480 | def new_ipsystem_posix(cmd): | |
vivainio
|
r477 | """ ctrl+c ignoring replacement for system() command in iplib. | |
Ignore ctrl + c in IPython process during the command execution. | |||
The subprocess will still get the ctrl + c signal. | |||
vivainio
|
r480 | ||
posix implementation | |||
vivainio
|
r477 | """ | |
p = subprocess.Popen(cmd, shell = True) | |||
old_handler = signal.signal(signal.SIGINT, signal.SIG_IGN) | |||
pid,status = os.waitpid(p.pid,0) | |||
signal.signal(signal.SIGINT, old_handler) | |||
if status and ip.options.verbose: | |||
print "[exit status: %d]" % status | |||
vivainio
|
r480 | def new_ipsystem_win32(cmd): | |
""" ctrl+c ignoring replacement for system() command in iplib. | |||
Ignore ctrl + c in IPython process during the command execution. | |||
The subprocess will still get the ctrl + c signal. | |||
win32 implementation | |||
""" | |||
old_handler = signal.signal(signal.SIGINT, signal.SIG_IGN) | |||
status = os.system(cmd) | |||
signal.signal(signal.SIGINT, old_handler) | |||
if status and ip.options.verbose: | |||
print "[exit status: %d]" % status | |||
vivainio
|
r477 | def init(): | |
o = ip.options | |||
try: | |||
o.verbose | |||
except AttributeError: | |||
o.allow_new_attr (True ) | |||
o.verbose = 0 | |||
vivainio
|
r480 | ip.IP.system = (sys.platform == 'win32' and new_ipsystem_win32 or | |
new_ipsystem_posix) | |||
vivainio
|
r477 | ||
init() | |||