File: mysubprocess.py

package info (click to toggle)
python-gevent 0.13.6-1%2Bnmu3
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 2,324 kB
  • sloc: python: 13,296; makefile: 95; ansic: 37
file content (49 lines) | stat: -rw-r--r-- 1,642 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import sys
import os
import subprocess
import signal
from subprocess import PIPE, STDOUT


class Popen(subprocess.Popen):

    def send_signal(self, sig):
        if sys.platform == 'win32':
            sig = signal.SIGTERM
        if hasattr(subprocess.Popen, 'send_signal'):
            try:
                return subprocess.Popen.send_signal(self, sig)
            except Exception, ex:
                sys.stderr.write('send_signal(%s, %s) failed: %s\n' % (self.pid, sig, ex))
                self.external_kill(str(ex))
        else:
            if hasattr(os, 'kill'):
                sys.stderr.write('Sending signal %s to %s\n' % (sig, self.pid))
                try:
                    os.kill(self.pid, sig)
                except Exception, ex:
                    sys.stderr.write('Error while killing %s: %s\n' % (self.pid, ex))
                    self.external_kill()
            else:
                self.external_kill()

    if not hasattr(subprocess.Popen, 'kill'):

        def kill(self):
            return self.send_signal(getattr(signal, 'SIGTERM', 15))

    if not hasattr(subprocess.Popen, 'terminate'):

        def terminate(self):
            return self.send_signal(getattr(signal, 'SIGTERM', 9))

    def interrupt(self):
        sig = getattr(signal, 'SIGINT', 2)
        return self.send_signal(sig)

    def external_kill(self, reason=''):
        if sys.platform == 'win32':
            sys.stderr.write('Killing %s: %s\n' % (self.pid, reason))
            os.system('taskkill /f /pid %s' % self.pid)
        else:
            sys.stderr.write('Cannot kill on this platform. Please kill %s\n' % self.pid)