Aus Python ein anderes Python Programm starten ohne behinderung?

  • Hallo,


    ich habe ein Python Programm, was IMMER läuft solange der PI an ist.


    Dieses Programm Startet, je nachdem was an den GPIO Ports passiert andere Programme.


    Dies mach ich mit folgenden Befehl:


    Code
    subprocess.call(["sudo", "motion"])


    Soweit so gut, das klappt alles, ABER wenn ich ein anderes Python Programm Aufrufen will:


    Code
    subprocess.call(["sudo", "python", "speichern.py"])


    dann bleibt das Hauptprogramm stehen bis das aufgerufene Programm beendet ist, ich möchte aber das beide Programme dann Zeitgleich laufen.



    Hat da jemand eine Idee?

  • Normalerweise importiert man ein Python Script... Die Module sind zB auch überwiegend nur Python Dateien - und führt dann nur entsprechende Funktionen / Klassen / Methoden aus dem anderen Script aus.


    Beispiel:


    Code: speichern.py
    def bild_speichern(datei='blub.jpg', wohin='/tmp/'):
        print "speichere Bild %s nach %s" % (datei, wohin)
    Code: Main.py
    import time
    import speichern
    
    while True:
        speichern.bild_speichern("bla.png")
        time.sleep(2)

    Alternativ ginge auch:

    Python
    import time
    from speichern import bild_speichern
    
    while True:
        bild_speichern("bla.png")
        time.sleep(2)


    Die Funktion bild_speichern habe ich so definiert das man beim Aufruf Parameter übergeben kann/muss. Varianten:

    Code
    bild_speichern()
    bild_speichern("bla.png")
    bild_speichern("bla.png", "/home/pi/")
    bild_speichern(datei="bla.png")
    bild_speichern(wohin="/home/pi/")
    bild_speichern(datei="bla.png", wohin="/home/pi/")
    bild_speichern(wohin="/home/pi/", datei="bla.png")


    Dein Problem bezüglich "dann bleibt das Hauptprogramm stehen" hat damit zu tun dass immer nur eine Sache auf ein mal ausgeführt / verarbeitet werden kann. Solange das Script also mit einem Befehl beschäftigt ist kann nichts anderes parallel ausgeführt werden und somit wird das Script blockiert. Vergleichbar mit einem Konsolen-Befehl, der deine Konsole auch solange blockiert bis der Befehl beendet wurde.


    Das lässt sich natürlich auch umgehen - aber ob das in deinem Fall wirklich nötig ist?


    Bezüglich Parallele Ausführung findest du auch hier weitere Beispiele:
    FAQ => Nützliche Links / Linksammlung => python: mehrere Funktionen parallel laufen lassen und sauber beenden (multiprocessing)
    FAQ => Nützliche Links / Linksammlung => python: threading.Thread beenden
    FAQ => Nützliche Links / Linksammlung => python: Tkinter: Im Hintergrund zählen
    ...usw...