Via Python andere Scripte starten und beenden

  • Lieber bootsmann,
    Ich bin noch relativ neu im Python, aber verstehe ich das richtig dass man das in etwa so tun soll?

    Starten des Programms lichterkette.py im Stammverzeichnis:

    Code
    subprocess.Popen("lichterkette.py")

    Schließen des Programms lichterkette.py:

    Code
    subprocess.Popen.kill("lichterkette.py")

    Einmal editiert, zuletzt von BillyJoel (19. November 2014 um 11:23)


  • Starten des Programms lichterkette.py im Stammverzeichnis:

    Code
    subprocess.Popen("lichterkette.py")

    Schließen des Programms lichterkette.py:

    Code
    subprocess.Popen.kill("lichterkette.py")

    Wenn das funktionieren würde, wäre das klasse! Ich checke das mal!

    @BillieJoel, so einfach scheint es leider nicht zu sein. Da scheint die Syntax nicht zu stimmen.

    Error:

    Code
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory

    Einmal editiert, zuletzt von osxHandler (19. November 2014 um 11:38)

  • Bitte benutzt immer vollständige Pfade zu euren Scripts/Programmen.

    lichterkette.py wird ja irgendwo liegen - gebt den Befehl pwd ein und euch wird der aktuelle Pfad in dem ihr euch befindet angezeigt...

  • Dann hat der Benutzer kein Recht die Datei zu lesen oder auszuführen (bitte nutzt einen Translator -> Permission denied -> Zugriff verweigert)

    In dem Fall würde ich aber mal vermuten das die Datei nicht ausführbar ist, also wäre das einfachste den Interpreter mit an zu geben bzw das Script an diesen zu übergeben - oder die Datei ausführbar zu machen.

  • Aber ich kann doch über Terminal mein Script starten, das funktioniert einwandfrei:

    Code
    python relais.py

    Ist da python der Interpreter? Wie gebe ich den denn mit im subprocess mit an?

    Code
    subprocess.Popen("python" ,"/root/relais.py")

    Einmal editiert, zuletzt von osxHandler (19. November 2014 um 12:34)


  • Aber ich kann doch über Terminal mein Script starten, das funktioniert einwandfrei:

    Code
    python relais.py


    Ja weil du da das Script an den Interpreter python übergibst.. Dann spielt es keine Rolle ob die Datei ausführ-Rechte hat und ein Shebang gesetzt ist

    Und bei subprocess am besten auch den vollständigen Pfad zum Interpreter angeben, rauszufinden mit: which python

  • Den Pfad habe ich implementiert.
    Aber die Syntax vom subprocess ist doch nicht wirklich korrekt, oder?

    Code
    subprocess.Pope.("/user/bin/python","/root/relais.py")

    Durch das Komma trenne ich doch die Argumente des Subprocesses. Und nach dem ersten Komma ist dort ja buffsize als Integer. Und nicht der Pfad zum Programm wie hier... Und in der Doku sehe ich auch keine PLatz, an den man den Interpreter eintragen kann?

  • Den auszuführenden Befehl (args) grenzt du mit [ und ] ein, also zum Beispiel:

    Code
    subprocess.Pope.(['/usr/bin/python', '/root/relais.py'])


    PS: /user/bin/python wirds nicht geben ;)

  • Code
    import subprocess
    import time
    
    
    cmd = 'python test_1.py'
    #sub = subprocess.Popen(['python', 'test_1.py'], stdout=subprocess.PIPE) #.communicate()
    sub = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    sub
    time.sleep(5)
    sub.kill()

    Gedanken würde ich mir eher über die Programmlogik machen und was für einen Sinn es hat, zwei unabhängige Programme zu schreiben und dieses mittels ''subprocess'' zu starten und zu killen. Ein Programm, in dem geregelt wird, wie, wann und warum die Lichterkette angeht und beendet wird.

    Edit:
    oder du schreibst dein "Lichterkette"-Programm so um, so dass du das Programm in dein Hauptprogramm importieren kannst um es von dort aus zu steuern. Ich an deiner Stelle würde Abstand von ''subprocess'' nehmen für dein Anliegen. Besser zu postest hier den Code der Lichterkette.

  • Ah das klärt einiges :)
    Wieso wird es das nicht geben? :O Den Pfad habe ich doch von "which python" bekommen?
    Liegt es daran, dass ich nun folgenden Fehler bekomme?

    Code
    File "starttest.py", line 9, in <module>
        p = subprocess.Popen(['/user/bin/python', 'root/relais.py'])
      File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
  • Ohje, klar - das ist usr!

    bootsmann, vielen Dank dafür! Das funktioniert einwandfrei! Danke Euch beiden! Und einen schönen Tag noch!

    Nur zum Verständnis: (OT)
    Wenn ich mich dazu entscheide, dass ich das alles wirklich in einem(!), wie oben schon angesprochen, Programm abwickele - kann ich den subprocess global ansteuern?

    Einmal editiert, zuletzt von osxHandler (19. November 2014 um 14:02)

  • Hallo Community,

    in allen meinen Python scripts steht immer in der ersten Zeile, ohne Ausnahme:

    Code
    #!/usr/bin/env python

    Wenn lichterkette.py im selben Verzeichnis steht wie das auzuführende Script,
    dann rufe ich lichterkette.py mit

    Code
    subprocess.Popen("./lichterkette.py")


    auf. Merke: "./"

    Allerdings ist das Aufrufen eines Python Scripts in dieser Form absolut "unpythonisch".
    Eleganter (= im Sinne von Python) wird es mit

    Code
    import lichterkette


    Das setzt allerdings voraus, dass licherkette.py strukturiert programmiert ist. Das heißt, es gibt eine oder mehrere Funktionen in lichterkette.py die man nutzen möchte/kann. Wenn man lichterkette.py als eigenständiges Skript trotzdem ausführen können möchte, kein Problem.
    Ist imho überhaupt nicht kompliziert, schaut mal in der Python Dokumentation unter "modules" nach.


  • Hallo Community,

    in allen meinen Python scripts steht immer in der ersten Zeile, ohne Ausnahme:

    Code
    #!/usr/bin/env python

    Wenn lichterkette.py im selben Verzeichnis steht wie das auzuführende Script,
    dann rufe ich lichterkette.py mit

    Code
    subprocess.Popen("./lichterkette.py")

    Das funktioniert aber nur wenn die Datei Ausführrechte hat (chmod +x)

    auf. Merke: "./"

    Besser wäre auch hier den vollständigen Pfad zum Script anzugeben, dann kann man auf den Punkt auch verzichten (der Punkt bezieht sich aufs aktuelle Verzeichnis, siehe dazu auch die am Anfang der Ausgabe von ls -la -> "." ist das aktuelle Verzeichnis und ".." das übergeordnete.)

    Allerdings ist das Aufrufen eines Python Scripts in dieser Form absolut "unpythonisch".
    Eleganter (= im Sinne von Python) wird es mit

    Code
    import lichterkette


    Das setzt allerdings voraus, dass licherkette.py strukturiert programmiert ist. Das heißt, es gibt eine oder mehrere Funktionen in lichterkette.py die man nutzen möchte/kann. Wenn man lichterkette.py als eigenständiges Skript trotzdem ausführen können möchte, kein Problem.
    Ist imho überhaupt nicht kompliziert, schaut mal in der Python Dokumentation unter "modules" nach.

    Das import alleine führt aber noch nichts aus, sondern erst ein Aufruf der darin befindlichen Anweisungen/Funktionen aka ' def '

  • Der Post hat mir gerade in meiner Verzweiflung weitergeholfen. Jedoch fehlt noch ein Puzzelteil Maigrafd vielleicht kannst du mir da geziehlt weiterhelfen. Meld dich mal per PM bei mir :daumendreh2:

    Da ich auch gerade an dem Subprocess.Popen Ding gestoßen bin hab ich gerade ein Problem entdeckt.
    Und zwar das die Motoren des Roboters weiter mit Strom versorgt werden aber nicht weiter mehr vom process gesteuert werden.
    Wenn mein Subprocess Popen aktiv läuft dann werden die ganze Zeit die GPIO´s von Raspi gesteuert. Wie kann ich es aber hinbiegen das die GPIO´s beim beenden des Subprocess wieder auf false gestellt werden.

    Ist das dieser GPIO Cleanup befehl in dem Subprocess Script ?? :helpnew:


    MFG Zappel

Jetzt mitmachen!

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