@Bio Salami: Beim letzten Thema wurde doch schon gesagt, dass man `os.system()` nicht verwendet, sondern das `subprocess`-Modul zum Starten von externen Programmen verwendet wird.
Klassennanmen werden als PascalCase geschrieben, damit man Klassen als solche schon am Namen erkennen kann. Normale Variablen werden per Konvention klein_mit_unterstrichen geschrieben.
`exit()` gibt es so eigentlich gar nicht, das ist eine Funktion die für den interaktiven Interpreter da ist. Wenn man ein Programm beenden will, dann nimmt man `sys.exit()`. Allerdings auch nur, wenn man zumindest potentiell etwas anderes als die implizite 0 als Rückgabecode an den Aufrufer übermitteln will. Ansonsten lässt man das Programm einfach ganz normal enden in dem halt keine Anweisungen mehr am Ende kommen und der Programmfluss am Ende vom Modul ankommt, und es so auf ganz ”natürliche” Art zuende ist.
Die `kill()`-Methode macht auch keinen Sinn, denn die wird ja vom Hauptthread aufgerufen, und *da* wirkt sich dann auch der `exit()`-Aufruf aus. Der beendet nicht den Thread, nur weil das in der Klasse steht.
Wenn es die `kill()`-Methode nicht mehr gibt und die Klasse nur noch aus der `__init__()` und `run()` besteht, braucht man die Klasse auch nicht. Dann kann man die Funktion die asynchron ausgeführt werden soll, auch über `Thread` und dessen `target`-Argument laufen lassen.
Das Originalprogramm macht letztlich genau das gleiche wie diese, um unnötigen Code der nichts weiter bewirkt, befreite Variante:
Code: Alles auswählen
#!/usr/bin/env python3
import os
from threading import Thread
def main():
Thread(target=os.system, args=["node-red"]).start()
input("Stop")
if __name__ == "__main__":
main()
`Thread` braucht man aber gar nicht, weil man mit dem `subprocess`-Modul externe Prozesse auch nicht blockierend starten kann:
Code: Alles auswählen
#!/usr/bin/env python3
import subprocess
def main():
with subprocess.Popen(["node-red"]) as node_red:
input("Stop")
node_red.terminate()
if __name__ == "__main__":
main()
Edit: Ich wünschte die Leute würden nicht immer `kill()` empfehlen, weil das tatsächlich so gemeint ist — das sendet ein SIGKILL! Vielleicht ist das ``kill``-Unix-Kommando schuld, denn das sendet trotz des Namens per Default ein SIGTERM.