~ellisonbg/ipython/bugfixes0411409

« back to all changes in this revision

Viewing changes to IPython/Extensions/ipy_signals.py

  • Committer: ville
  • Date: 2008-02-16 09:50:47 UTC
  • mto: (0.12.1 ipython_main)
  • mto: This revision was merged to the branch mainline in revision 990.
  • Revision ID: ville@ville-pc-20080216095047-500x6dluki1iz40o
initialization (no svn history)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
""" Advanced signal (e.g. ctrl+C) handling for IPython
 
2
 
 
3
So far, this only ignores ctrl + C in IPython file a subprocess
 
4
is executing, to get closer to how a "proper" shell behaves.
 
5
 
 
6
Other signal processing may be implemented later on.
 
7
 
 
8
If _ip.options.verbose is true, show exit status if nonzero
 
9
 
 
10
"""
 
11
 
 
12
import signal,os,sys
 
13
import IPython.ipapi
 
14
import subprocess
 
15
 
 
16
ip = IPython.ipapi.get()
 
17
 
 
18
def new_ipsystem_posix(cmd):
 
19
    """ ctrl+c ignoring replacement for system() command in iplib.
 
20
    
 
21
    Ignore ctrl + c in IPython process during the command execution. 
 
22
    The subprocess will still get the ctrl + c signal.
 
23
    
 
24
    posix implementation
 
25
    """
 
26
    
 
27
    p =  subprocess.Popen(cmd, shell = True)
 
28
    
 
29
    old_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
 
30
    pid,status = os.waitpid(p.pid,0)
 
31
    signal.signal(signal.SIGINT, old_handler)
 
32
    if status and ip.options.verbose:
 
33
        print "[exit status: %d]" % status
 
34
    
 
35
def new_ipsystem_win32(cmd):    
 
36
    """ ctrl+c ignoring replacement for system() command in iplib.
 
37
    
 
38
    Ignore ctrl + c in IPython process during the command execution. 
 
39
    The subprocess will still get the ctrl + c signal.
 
40
    
 
41
    win32 implementation
 
42
    """
 
43
    old_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
 
44
    status = os.system(cmd)
 
45
    signal.signal(signal.SIGINT, old_handler)
 
46
    if status and ip.options.verbose:
 
47
        print "[exit status: %d]" % status
 
48
    
 
49
    
 
50
def init():
 
51
    o = ip.options
 
52
    try:
 
53
        o.verbose
 
54
    except AttributeError:
 
55
        o.allow_new_attr (True )
 
56
        o.verbose = 0
 
57
        
 
58
    ip.IP.system = (sys.platform == 'win32' and new_ipsystem_win32 or 
 
59
                    new_ipsystem_posix)
 
60
    
 
61
init()
 
62
    
 
 
b'\\ No newline at end of file'