Wie kann man ein Python Skript mit einem Python Skript beenden?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Abend zusammen

    Ich habe einen Raspberry Pi 3 Model B und möchte mit diesem ein kleines Auto bauen (bin aber Einsteiger)
    Ich habe insgesamt 9 Skripte in Python geschrieben (8 Skripte für die jeweiligen Fahrrichtungen und ein Stop Skript).
    Ich arbeite mit GPIO und meine Zählweise ist BOARD.


    Nun komme ich zu meinem Problem:

    Ich muss die Funktion haben, das ich ein Fahrrichtungsskript mit dem Stop Skript beenden kann. Wenn ich das über zwei Konsolen testen möchte dann werden die Motoren zwar abgeschaltet, aber der Prozess läuft im Hintergrund weiter. Das die Motoren abschalten schaffe ich durch GPIO.cleanup() und mit sys.exit() beende ich das Stop Skript.
    Ich kann via killall -r .py alle PythonSkripe töten aber leider nur über die Konsole und wenn ich diesen Befehl in das StopSkript einbette dann erscheint beim ausführen in der Konsole das der Name killall nicht definiert werden kann.

    Könnt ihr mir sagen was ich machen kann, also muss ich für killall irgendwas importieren oder habt ihr gar eine andere Lösung für mich?

    Wenn ihr noch mehr Infos brauch einfach fragen :thumbs1:

    Schon mal danke im vorraus

    raspi5342

  • Wie kann man ein Python Skript mit einem Python Skript beenden?? Schau mal ob du hier fündig wirst!

  • Hallo raspi5342,


    herzlich Willkommen in unserem Forum!

    Das klingt für mich nach "broken design".

    Warum 8 Fahrtrichtungsskripte plus 1 Häuptlingskript?

    ==> 1 Skript, das alles macht und kann und Dein Problem gehört der Vergangenheit an.

    killall oder kill funktioniert nur, wenn Du dies als externes Kommando aufrufst. Dazu suchst Du

    Code
    Linux Python Aufruf externer Kommandos
    Linux Python Aufruf Shell Kommandos

    Auf diese Weise aufgeschlaut kommst Du dann selber zur Lösung...

    Gutes Gelingen!

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Also ich sollte mal mein Projekt komplett beschreiben?
    Ich will über eine Website das Fahrzeug steuern und das über Pfeil Buttons. Ich nutzte das Betriebssystem raspbian.
    Durch Druck auf einen Button wird ein PHP Skript gestartet welches wiederum das entsprechende Python Skript ausführt.

    nur die stopfunktion (die auch in Pyrhon geschrieben ist) funktioniert nicht?


  • Ich habe einen Raspberry Pi 3 Model B und möchte mit diesem ein kleines Auto bauen (bin aber Einsteiger)
    Ich habe insgesamt 9 Skripte in Python geschrieben (8 Skripte für die jeweiligen Fahrrichtungen und ein Stop Skript).
    Ich arbeite mit GPIO und meine Zählweise ist BOARD.


    Nun komme ich zu meinem Problem:

    Ich muss die Funktion haben, das ich ein Fahrrichtungsskript mit dem Stop Skript beenden kann. Wenn ich das über zwei Konsolen testen möchte dann werden die Motoren zwar abgeschaltet, aber der Prozess läuft im Hintergrund weiter. Das die Motoren abschalten schaffe ich durch GPIO.cleanup() und mit sys.exit() beende ich das Stop Skript.

    Ich glaube da denkst du in die falsche Richtung.

    Man muss nicht ein Script haben - in meinem RoPi Projekt hab ich auch viele verschiedene. Aus meiner Sicht ist es gut wenn du verschiedene Aufgabenbereiche in unterschiedliche Scriptdateien aufteilst. Aber deshalb musst du nicht jede Scriptdatei einzeln ausführen! Bei meinem RoPi Projekt gibt es nur sog. Daemon-Scripts die als zusätzlich einzelne Prozesse laufen... Das sind zZt. 3 von insg. 16.
    Der allgemein übliche Weg wäre ein Main.py Script zu haben in dem man die Funktionen der anderen Scripts importiert und dann zur gegebenen Zeit die jeweilige Funktion ausführt.

    Am besten zu zeigst mal deine ganzen Scripts und beschreibst was du dir dabei gedacht hast.
    FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

  • Ich glaube da denkst du in die falsche Richtung.

    Man muss nicht ein Script haben - in meinem RoPi Projekt hab ich auch viele verschiedene. Aus meiner Sicht ist es gut wenn du verschiedene Aufgabenbereiche in unterschiedliche Scriptdateien aufteilst. Aber deshalb musst du nicht jede Scriptdatei einzeln ausführen!
    Der allgemein übliche Weg wäre ein Main.py Script zu haben in dem man die Funktionen der anderen Scripts importiert und dann zur gegebenen Zeit die jeweilige Funktion ausführt.

    Am besten zu zeigst mal deine ganzen Scripts und beschreibst was du dir dabei gedacht hast.
    FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten


    Alles klar ich werde die morgen mal reinsetzt weil ich jetzt grade keine Möglichkeit habe die Skripte reinzusetzen aber schonmal Danke für den Hinweis mit dem Main.py.

    Werde ich mich morgen mal direkt mit auseinander setzten?

  • also das Skript besagt das das Auto mittels PWM Signal vorwärts fahren soll und das klappt auch. Und die anderen Skripte sind genauso nur anhand der Hashtags sind andere Ausgänge geschaltet. Als nächstes kommt das Stop Skript.


    Ich weis das ich in diesem Skript doppelt arbeite aber das war nur ein test ;)
    Dieses Skript schaltet mir zwar die AUsgänge wieder frei aber der Prozess der Vorwärtsskriptes läuft weiter.

    MfG

    raspi5342

  • So funktioniert das nicht. Für so ein Problem schreibt man EIN Programm, das abhängig zB von anderen GPIOs die gewünschte fahrfunktion ausführt.

    Code
    while True:
          if GPIO.input(JOYSTICK_UP):
                 forward()
           elif GPIO.input(JOYSTICK_RIGHT):
                  right()
         ....


    Wobei du dann in den jeweiligen Funktionen forward, right, etc deine outputs entsprechend setzt.


  • So funktioniert das nicht. Für so ein Problem schreibt man EIN Programm, das abhängig zB von anderen GPIOs die gewünschte fahrfunktion ausführt.

    Code
    while True:
         if GPIO.input(JOYSTICK_UP):
                forward()
          elif GPIO.input(JOYSTICK_RIGHT):
                 right()
        ....


    Wobei du dann in den jeweiligen Funktionen forward, right, etc deine outputs entsprechend setzt.

    Danke für deine Antwort aber wir machen das ja über eine website die in /var/www/html liegt und auf dieser haben wir Buttons wo wir drauf klicken um die Aktionen zu starten.
    Ich habe auch schon if Anweisungen versucht aber diese funktionieren irgendwie nur bei GPIO.input und nicht bei den outputs.
    Gibt es denn irgendwie die möglichkeit das man die .png dateinen der Pfeile in das Skript mit einbezieht um mit diesen dann zu arbeiten?

  • Bitte nicht Beiträge vollständig quoten/zitieren, vor allem wenn diese genau da drüber stehen.


    Wenn ihr eigentlich die Steuerung über eine Webseite vornehmt dann empfehle ich: FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX

    Das nutze ich für mein RoPi Projekt ebenfalls - es macht kein Sinn mithilfe von apache2 und PHP auch noch Python Scripts auszuführen, zumal diese wichtige Info du von Anfang an hättest erwähnen sollen. Zum einen schaufelt man sich dann nur sein eigenes Grab, wenn man tauschend verschiedene Programmiersprachen vermischt, zum anderen hast Du ja nun auch das Problem das da viele verschiedene Scripts im Hintergrund laufen und die wiederum musst du wieder beenden können... Da würde ich pauschal sagen dass das gesamte Konstrukt fehlerhaft ist und dir früher oder später um die Ohren fliegen wird.

    Klick einfach mal in meiner Signatur auf den RoPi Link und dort direkt am Anfang auf "Entwicklungsthread", dort wiederum beginnst du mit dem Ende und blätterst dann die Beiträge langsam zurück - irgendwann (Seite 8 und 9) stößt du auf eine Beschreibung meines Web-Interfaces zur Steuerung meines Gefährts, und das basiert auf besagter Anleitung. Auf der letzten Seite des Threads siehst du die Aufteilung auf mehrere Scripts sowie die Struktur. Auf Seite 8 eine Beschreibung des Web-Interfaces und auf Seite 9 auch ein paar Scripts dazu, auch wenn die nicht mehr aktuell sind funktionierte das damals sehr gut.

    Alternativ schaust du dir das an: FAQ => Nützliche Links / Linksammlung => PHP: Anleitung zum schalten von GPIO
    Da du aber PWM nutzen willst solltest du die erste Anleitung bevorzugen.

    Und wenn du dann noch Hilfe brauchst dann zeig bitte alle Scripts inkl. der PHP Scripts - nur diesmal poste die bitte auf Codepad weil hier die Einrückungen zuletzt bei dir defekt waren

  • Das Vorgehen ueber PHP ist unguenstig, weil PHP nur laeuft, wenn jemand eine Aktion ausfuehrt. Damit hast du aber das Problem, dass du zB nicht auf Sensoreingaben reagieren kannst - sondern nur auf Steuerkommandos aus dem Web.

    Besser waere es, einen Python Webserver zB in tornado oder bottle zu schreiben, und damit gleichzeitig Steuerkommandos entgegenzunehmen, und GPIO zu schalten. Der laueft dann die ganze Zeit, da muss nix gekillt werden.

    *WENN* du schon mit PHP arbeiten willst, dann solltest du deinen GPIO-Code einfach direkt auf PHP umstellen, und dadurch dann das Problem mit den diversen Prozessen einfach gar nicht mehr haben.

  • Hättest du denn mal ein Beispiel für mich wie ich das über PHP realisieren kann also nur mal für das Verständnis ?
    W im wie gesagt ich bin Einsteiger ?

    Wie läuft das denn dann über PHP ab? Also warum habe ich dann nicht mehr das Problem mit den Prozessen? Weil die PHP Skripte liegen bei mir im html odner

  • Nein, weil sie halt keine Prozesse starten. exec startet einen Prozess von PHP aus, das ist Sinn & Zweck der Uebung. Dein PHP-Code wird durch den Apache ausgefuehrt. Da steckt zwar ultimativ auch ein Prozess hinter, aber darum musst du dich nicht kuemmern, das handhabt alles der Apache.

    Ich programmiere kein PHP, darum kann ich selbst dir da kein Beispiel praesentieren. Aber es gibt hier in der FAQ-Zone ausreichend Beispiele, und meigrafd hat dir doch auch schon einen Link gezeigt. Hast du dir das mal angeschaut?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!