ipy_signals.py
61 lines
| 1.6 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. | ||
Bernardo B. Marques
|
r4872 | |||
Ignore ctrl + c in IPython process during the command execution. | ||||
vivainio
|
r477 | The subprocess will still get the ctrl + c signal. | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r480 | posix implementation | ||
vivainio
|
r477 | """ | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r477 | p = subprocess.Popen(cmd, shell = True) | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r477 | 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 | ||||
Bernardo B. Marques
|
r4872 | |||
def new_ipsystem_win32(cmd): | ||||
vivainio
|
r480 | """ ctrl+c ignoring replacement for system() command in iplib. | ||
Bernardo B. Marques
|
r4872 | |||
Ignore ctrl + c in IPython process during the command execution. | ||||
vivainio
|
r480 | The subprocess will still get the ctrl + c signal. | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r480 | 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 | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r477 | def init(): | ||
o = ip.options | ||||
try: | ||||
o.verbose | ||||
except AttributeError: | ||||
o.allow_new_attr (True ) | ||||
o.verbose = 0 | ||||
Bernardo B. Marques
|
r4872 | |||
ip.system = (sys.platform == 'win32' and new_ipsystem_win32 or | ||||
vivainio
|
r480 | new_ipsystem_posix) | ||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r477 | init() | ||