View difference between Paste ID: 7SBTx8KA and ZY0METPS
SHOW: | | - or go back to the newest paste.
1
import atexit
2-
import atexit
2+
import os
3-
import os
3+
import signal
4-
import signal
4+
import subprocess
5-
import subprocess
5+
import sys
6-
import sys
6+
import threading
7-
import threading
7+
import time
8-
import time
8+
9
10
class SignalException(Exception):
11-
class SignalException(Exception):
11+
    ...
12-
    ...
12+
13
14
pid = os.getpid()
15-
pid = os.getpid()
15+
print("PID is", pid)
16-
print("PID is", pid)
16+
17
18
def raiser(signal, *rest):
19-
def raiser(signal, *rest):
19+
    raise SignalException(f"Got signal {signal}", signal)
20-
    raise SignalException(f"Got signal {signal}", signal)
20+
21
22
def kill(pid, sig, delay):
23-
def kill(pid, sig, delay):
23+
    time.sleep(delay)
24-
    time.sleep(delay)
24+
    os.kill(pid, sig)
25-
    os.kill(pid, sig)
25+
26
27
if len(sys.argv) == 2:
28-
if len(sys.argv) == 2:
28+
    try:
29-
    try:
29+
        signal_value = int(sys.argv[1])
30-
        signal_value = int(sys.argv[1])
30+
    except ValueError:
31-
    except ValueError:
31+
        try:
32-
        try:
32+
            sig = sys.argv[1].upper()
33-
            sig = sys.argv[1].upper()
33+
            signal_value = signal.Signals[sig]
34-
            signal_value = signal.Signals[sig]
34+
        except KeyError:
35-
        except KeyError:
35+
            raise SystemExit("A valid signal number or signal name is required")
36-
            raise SystemExit("A valid signal number or signal name is required")
36+
37
    try:
38-
    try:
38+
        signal_type = signal.Signals(signal_value)
39-
        signal_type = signal.Signals(signal_value)
39+
    except ValueError:
40-
    except ValueError:
40+
        raise SystemExit("Signal is unkown")
41-
        raise SystemExit("Signal is unkown")
41+
else:
42-
else:
42+
    signal_value = None
43-
    signal_value = None
43+
    signal_type = None
44-
    signal_type = None
44+
45
46
class Button:
47-
class Button:
47+
    buttons = []
48-
    buttons = []
48+
49
    def __init__(self, pin):
50-
    def __init__(self, pin):
50+
        self.pin = pin
51-
        self.pin = pin
51+
        self.buttons.append(self)
52-
        self.buttons.append(self)
52+
53
    @classmethod
54-
    @classmethod
54+
    def close_all(cls):
55-
    def close_all(cls):
55+
        for button in cls.buttons:
56-
        for button in cls.buttons:
56+
            print("Closing button", button.pin)
57-
            print("Closing button", button.pin)
57+
            button.close()
58-
            button.close()
58+
59
    def close(self):
60-
    def close(self):
60+
        ...
61-
        ...
61+
62
63
atexit.register(Button.close_all)
64-
atexit.register(Button.close_all)
64+
[Button(x) for x in range(10)]
65-
[Button(x) for x in range(10)]
65+
66
if signal_type:
67-
if signal_type:
67+
    # must be set in MainThread
68-
    # must be set in MainThread
68+
    try:
69-
    try:
69+
        signal.signal(signal_type, raiser)
70-
        signal.signal(signal_type, raiser)
70+
    except OSError:
71-
    except OSError:
71+
        raise SystemExit("Invalid Signal")
72-
        raise SystemExit("Invalid Signal")
72+
73
74
    # Run a worker thread to signal myself.
75-
    # Run a worker thread to signal myself.
75+
    threading.Thread(target=kill, args=(pid, signal_type, 2), daemon=True).start()
76-
    threading.Thread(target=kill, args=(pid, signal_type, 2), daemon=True).start()
76+
77
try:
78-
try:
78+
    time.sleep(3600)
79-
    time.sleep(3600)
79+
except KeyboardInterrupt:
80-
except KeyboardInterrupt:
80+
    print("Got CTRL+C")
81-
    print("Got CTRL+C")
81+
except SignalException as sig:
82-
except SignalException as sig:
82+
    print(sig.args[0])
83-
    print(sig.args[0])
83+
    sys.exit(sig.args[1])
84-
    sys.exit(sig.args[1])
84+