Code: Select all
class Script:
'''
Class instantiated by the parent process
'''
def __init__(self, *args, **kwargs):
self.process = None
self.start()
def __del__(self):
if self.process:
if self.process.poll() is None:
self.stop()
def start(self):
popen_kwargs = {
'executable': sys.executable,
'creationflags': 0 * subprocess.CREATE_DEFAULT_ERROR_MODE
| subprocess.CREATE_NEW_PROCESS_GROUP,
}
self.process = subprocess.Popen(['python', os.path.realpath(__file__)],
**popen_kwargs)
def stop(self):
if not self.process:
return
try:
self.process.send_signal(signal.CTRL_C_EVENT)
self.process.wait()
self.process = None
except KeyboardInterrupt:
pass
class ScriptSubprocess:
def __init__(self):
self.stop = False
def run(self):
try:
while not self.stop:
# ...
except KeyboardInterrupt:
# interrupted!
pass
finally:
# make a *clean* exit if interrupted
self.stop = True
if __name__ == '__main__':
p = ScriptSubprocess()
p.run()
del p
< /code>
und es funktioniert in einem eigenständigen Python -Interpreter einwandfrei. self.process.send_signal (signal.ctrl_c_event)
Code: Select all
Popen.send_signal(signal)
Sendet das Signalsignal an das Kind. Ctrl_c_event und
Strg_break_event können an Prozesse gesendet werden, die mit einem Parameter für Erstellungsflags gestartet werden, der create_new_process_group enthält.
Code: Select all
subprocess.CREATE_NEW_PROCESS_GROUP
Ein Popen creationFlags -Parameter, um anzugeben, dass eine neue Prozessgruppe erstellt wird. Dieses Flag ist für die Verwendung von os.kill () auf der Subprozess erforderlich. Subprozess mit ctrl_c_event in der realen Anwendung. (Wie ohne dieses Flag)
Da die reale Anwendung (d. H. Der übergeordnete Vorgang) auch setConoSoRtlHandler bestimmte Signale verwendet, versuche ich auch, CreationFlags mit Subprozess zu übergeben. Ctrl_c_event.>