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 | + |