Wie führt man 2 Prozesse parallel aus?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
SaHo81
User
Beiträge: 1
Registriert: Donnerstag 30. Juli 2015, 18:16

Hallo Community,

ich bin neu was das Thema Programmieren anbelangt und komme jetzt leider nicht weiter und hoffe nun auf eure Unterstützung.
Mein Projekt ist eine Photobooth zu basteln mit einer Spiegelreflexkamera und einem Raspberry Pi 2 Model B, zuzüglich drei LEDs (rot, gelb, grün) die über GPIO angesteuert werden und einen jeweiligen Status anzeigen.
Bis zu diesem Punkt funktioniert auch alles einwandfrei.
Nun möchte ich aber zusätzlich noch ein kleines Schmankerl hinzufügen:
Am Ende des Prozesses werden die 3 soeben geschossenen Fotos nun auf dem Monitor nacheinander angezeigt, quasi als eine kleine Diashow (siehe im Hauptcode Zeile 25 die auf Zeile 2 "def display pics" verweist).
Während die Diashow der 3 Fotos läuft sollen in diesem Zeitfenster die drei LEDs wie ein Lauflicht in einer Endlosschleife angesteuert werden.
Dies habe ich mit einem Subcode (zweite Python-Datei) mit dem Befehl "subprocess.call" (Codezeile 4 im Hauptcode) erreichen wollen.
Leider musste ich aber feststellen, dass der Hauptcode nicht weiterläuft während der Subprozess ausgeführt wird und der Hauptcode auf Beendigung des Subprozesses wartet und erst dann weiterläuft.
Der Hauptcode muss in meinem Fall aber währenddessen weiterlaufen und der Subcode (Lauflicht mit 3 LEDs) soll beendet werden sobald im Hauptcode die Defintion "def display pics" abgeschlossen wurde, sprich wenn die Diashow mit den 3 Fotos beendet ist.
Wie kann ich dies umsetzen?

Ausschnitt aus dem Hauptcode:

Code: Alles auswählen

# define the photo taking function for when the big button is pressed
def display_pics(jpg_group):
    
    subprocess.call("sudo python /home/pi/scripts/photobooth/flashingLEDs.py", shell=True)
    class Alarm(Exception):
     pass
    def alarm_handler(signum, frame):
        raise Alarm
    signal(SIGALRM, alarm_handler)
    alarm(3)
    try:
        screen = init_pygame()
        alarm(0)
    except Alarm:
        raise KeyboardInterrupt          
    for i in range(0, replay_cycles): #show pics a few times
        for i in range(1, total_pics+1): #show each pic
            filename = config.file_path + jpg_group + "-0" + str(i) + ".jpg"
            show_image(filename)
            time.sleep(replay_delay) # pause

    finally:
        print "All Done"
    try:
        display_pics(now)
    except Exception, e:
        tb = sys.exc_info()[2]
        traceback.print_exception(e.__class__, e, tb)
    pygame.quit()
    print "Done"
    time.sleep(restart_delay)
    show_image(real_path + "/intro.png"); 
    GPIO.output(READY_LED, True)

Subcode:

Code: Alles auswählen

import RPi.GPIO as GPIO, time, os, subprocess

# GPIO setup
GPIO.setmode(GPIO.BCM)
BUSY_LED = 22
POSE_LED = 18
READY_LED = 23
GPIO.setup(POSE_LED, GPIO.OUT)
GPIO.setup(READY_LED, GPIO.OUT)
GPIO.setup(BUSY_LED, GPIO.OUT)

GPIO.output (READY_LED, True)
time.sleep(0.2)
GPIO.output (READY_LED, False)
GPIO.output (POSE_LED, True)
time.sleep(0.2)
GPIO.output (POSE_LED, False)
GPIO.output (BUSY_LED, True)
time.sleep(0.2)
GPIO.output (BUSY_LED, False)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also wenn du aus Python heraus eine anderes Python-Skript mittels `subprocess` startest, dann hast du in 99% der Fälle was falsch gemacht.

Im vorliegenden Fall macht es wohl mehr Sinn, den Code für's geblinke in einen eigenen Thread auszulagern. Wenn du die Diashow startest, startest du den Thread und beim beendenen der Diashow beendest du ihn.

Gruß, noisefloor
Antworten