Aus Master Python Script ein Slave Python Script aufrufen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Kannst mal versuchen ob der nachfolgende Code läuft. Ich habe noch nie etwas mit 'ProcessPool' gemacht und den Code jetzt auch nicht getestet.

    Noch eine Anmerkung zu deiner Zeile 56. Wenn du in einer Funktion eine weitere aufrufen willst und dabei noch ein Argument 'water_led' übergeben willst, dann musst du dafür sorgen, das 'water_led' auch in der Funktion verfügbar ist. Sprich du musst es erst der Funktion übergeben, so wie mit 'video_file'.

    Aber das ist ja eh der falsche Ort, denn es war ja mal gewünscht dass der Wasserwerfer und die Videoaufnahme parallel ablaufen.

    Sollte mein Code nicht funktionieren, dann warten wir besser auf DeaD_EyE.

    Zu deinen Fehlermeldungen kann ich dir leider nichts sagen. Da müsste ich auch viel googln.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Aus Master Python Script ein Slave Python Script aufrufen? Schau mal ob du hier fündig wirst!

  • Es sieht so aus als dass der Code läuft ohne die PIR zu beeinflussen. Anbei die Terminal-Ausgabe.

    Terminal-Ausgabe.pdf

    Seltsam ist, dass beim zweiten Mal heiße Flasche schwenken um 23:55:03 eine doppelt so große mp4 erzeugt wurde.

    Im NAS ist die h264 nur halb so groß. Die anderen Dateien stimmen bis auf wenige Kb überein.

    Zur Fehlermeldung im Beitrag 4 noch der Hinweis, dass diese Meldung oder eine sehr ähnliche Meldung erscheint, wenn vor dem Starten des Scriptes MotionEye und somit auch Motion die picamera in Beschlag hat. Aus diesem Grund habe ich den Autostart von MotionEye deaktiviert.

  • Auf #21 antworte ich später. Diese Antwort bezieht sich auf einen älteren Beitrag auf Seite 1.

    Hallo DeaD_EyE,

    mit str meinst Du vermutlich string.

    Einen string packt man eigentlich in Anführungzeichen aber wo muss ich diese setzen?

    Das war leider nicht der Fehler.

    Python
    from pathlib import Path
    from subprocess import run
    
    some_path = Path("test/test123")
    
    run(["echo", some_path])

    Gibt den Pfad als str aus und nicht den String der Repräsentation (repr).

    str ist eine Funktion, um Objekte in ein String umzuwandeln.

    Zitat

    test/test123

    Ich bin nicht von ausgegangen, dass Pfad-Objekte automatisch in str umgewandelt werden. Diese Umwandlung geschieht implizit.

    Da ich Python schon etwas länger nutze, ist es für mich schwierig mir zu merken, welche Version was unterstützt. Jedenfalls wird auf dem RPi aktuell Python 3.7 verwendet. D.h. die Umwandlung in str braucht man nicht.

    Changed in version 3.6: executable parameter accepts a path-like object on POSIX.

    Changed in version 3.8: executable parameter accepts a bytes and path-like object on Windows.

    Es kann aber auch mal vorkommen, dass es Funktionen gibt, die nicht mit Path-Objekten funktionieren.

    Mittlerweile sind aber so ziemlich alle Funktionen/Methoden der Standardbibliothek in der Lage Path Objekte zu verarbeiten, sofern die Funktion/Methode einen Pfad erwartet. Jedenfalls sieht man ähnlichen Code, wenn man in die Standardbibliothek schaut.

    Den ProcessPoolExecutor habe ich vorgeschlagen, da die Worker/Prozesse einmal gestartet werden und aktiv bleiben. Im Gegensatz zu threading.Thread wird jedes Mal ein neuer Thread erstellt.

  • Hallo,

    die Funktion 'task' gibt es schon und daraus werden die Funktionen für deine Videotransformation aufgerufen. Diese Funktion mit dem Argument 'water_led' aufzurufen macht keinen Sinn.

    Ich habe das gerade eben vereinfacht nachgestellt und mein Code hat funktioniert.

    Die Zeile:

    Code
    process_pool.submit(start_watercannon, water_led)

    ruft die Funktion 'start_watercannon' auf und übergibt ihr das Argument 'water_led'. Also eigentlich alles so wie es sein soll.

    Bekommst du Fehlermeldungen?

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis,

    hier ist der Code mit dem ich jetzt noch einmal getestet habe.

    Anbei noch einmal die Terminal Ausgabe dazu. Ohne Fehlermeldung wurden vier 10 sec. Videos im Abstand von 11 - 15 sec aufgenommen aber ohne Aktivierung des Wasserwerfers. In der Terminal Ausgabe fehlen auch " Wasserwerfer an" und Wasserwerfer aus".

    Terminal-Ausgabe2.pdf

    Seltsam war, als ich in Thonny einen Teil der Terminal Ausgabe markiert und die Markierung mit der Maus nach oben gezogen habe wurde das Markieren blockiert und Chromium versuchte die Adresse des PI zu erreichen aber scheiterte mit der Meldung "Die Website ist nicht erreichbar".

    Gute N8

  • Hallo,

    wie sieht das Ergebnis hiermit aus?

  • Hallo Hofei,

    wenn ich Deine Änderungen richtig erkannt habe wird der Wasserwerfer jetzt

    mit der Kombination start_watercannon(water_led) und water_led.blink(on_time=1, off_time=0.5, n=1, background=True) aufgerufen.

    Damit funzt der Wasserwerfer und in den Videos ist zu Beginn auch der Wasserstrahl zu sehen.

    Alle h264-Videos sind im NAS angekommen.

    Der kürzeste zeitliche Abstand zw. den Videos beträgt 13 sek. Bei diesem Test war ich der "Kater" und war vermutlich nicht aktiv genug vor den PIR.

    Es sind zwei Videos dabei die nur 5 sek. lang sind und dementsprechend auch nur ca. 11 Mb groß sind, bei der Aufnahme davor ist eine Unregelmäßigkeit im Terminal-Protokoll (rot formatiert).

    Terminal-Ausgabe-#30.pdf

    Der Script-Neustart gelingt nur nach einem PI-Neustart.

    mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC

    mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0x6d02c0 (ENOSPC)

    mmal: mmal_connection_enable: output port couldn't be enabled

    Backend terminated or disconnected. Use 'Stop/Restart' to restart.

    Kann das damit zusammenhängen?

    da die Worker/Prozesse einmal gestartet werden und aktiv bleiben.

  • Backend terminated or disconnected. Use 'Stop/Restart' to restart.

    Diese Meldung stammt von PiCamera. mmal steht wohl für Multimedia Abstraction Layer.

    Referenz: https://forums.pimoroni.com/t/camera-not-w…t-enospc/3789/5

    Mögliche Fehlerbehebung ist ein Firmware-Update und/oder das Vergrößern des GPU-Speichers.

    Dann wird noch darauf hingewiesen, dass raspi-config einiges durcheinander bringen kann und man mit folgendem Befehlen kann man die Firmware aus dem Raspberry Pi OS Repository installieren.

    Code
    sudo apt-get update
    sudo apt-get install --reinstall libraspberrypi0 libraspberrypi-{bin,dev,doc} raspberrypi-bootloader
    sudo reboot

    Bei den anderen hat es das Problem aber nicht gelöst.

  • Hallo DeaD_EyE,

    jetzt habe ich erst einmal den GPU-Speichers von 256 auf 512 erhöht. An das Firmware-Update habe ich mich noch nicht herangetraut.

    Nach dem Ändern des GPU-Speichers erhalte ich beim erneuten Starten des Scriptes

    >>> %Run 'ProzessPool#30.py'

    mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC

    mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0x686cd0 (ENOSPC)

    mmal: mmal_connection_enable: output port couldn't be enabled

    Traceback (most recent call last):

    File "/home/ich-bins/ProzessPool#30.py", line 100, in <module>

    main(pool)

    File "/home/ich-bins/ProzessPool#30.py", line 76, in main

    camera = picamera.PiCamera()

    File "/usr/lib/python3/dist-packages/picamera/camera.py", line 433, in __init__

    self._init_preview()

    File "/usr/lib/python3/dist-packages/picamera/camera.py", line 513, in _init_preview

    self, self._camera.outputs[self.CAMERA_PREVIEW_PORT])

    File "/usr/lib/python3/dist-packages/picamera/renderers.py", line 558, in __init__

    self.renderer.inputs[0].connect(source).enable()

    File "/usr/lib/python3/dist-packages/picamera/mmalobj.py", line 2212, in enable

    prefix="Failed to enable connection")

    File "/usr/lib/python3/dist-packages/picamera/exc.py", line 184, in mmal_check

    raise PiCameraMMALError(status, prefix)

    picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources

  • Hallo Hofei,

    das Problem tauchte bisher nur im Zusammenhang mit ProzessPoolExecutor auf.

    camera.close() habe ich nach camera.stop_recording() eingefügt, Flasche mit warmen Wasser gefüllt und vom Balkon baumeln lassen.

    Nach der Aufnahme von einem Flaschen-Video stoppte ich das Script und startet es erneut - !BINGO!

    Die Fehlermeldungen blieben aus. :thumbup:

  • Zu früh gefreut.

    Das Script konnte erneut ohne PI-Neustart und Fehlermeldung gestartet werden und zeigte im Thonny-Terminal

    Warte auf Bewegung

    Als dann di PIR Bewegung erkannten wurde nachfolgende Fehlermeldung in das Thonny-Terminal geschrieben.

    >>> %Run 'ProzessPool#30.py'

    Warte auf Bewegung

    Bewegung erkannt - 20211020_123209

    Wasserwerfer an/aus

    Video-Aufnahme läuft

    Aufnahme beendet - 20211020_123220

    Fertig für nächste Bewegungserkennung - 20211020_123220

    Warte auf Bewegung

    Übertragung von 20211020_123209.h264 abgeschlossen

    AVC-H264 import - frame size 1920 x 1080 at 30.000 FPS

    Importing AVC-H264: | | (01/100)

    .

    .

    Importing AVC-H264: |=================== | (99/100)

    AVC Import results: 298 samples - Slices: 5 I 293 P 0 B - 0 SEI - 5 IDR

    Saving to /home/ich-bins/motioneye/Camera1/20211020_123209.mp4: 0.500 secs Interleaving

    ISO File Writing: | | (01/100)

    .

    .

    ISO File Writing: |=================== | (99/100)

    Transkodierung abgeschlossen

    Original 20211020_123209.h264 entfernt

    Bewegung erkannt - 20211020_123312

    Traceback (most recent call last):

    File "/home/ich-bins/ProzessPool#30.py", line 101, in <module>

    main(pool)

    File "/home/ich-bins/ProzessPool#30.py", line 89, in main

    camera.annotate_text = date_time

    File "/usr/lib/python3/dist-packages/picamera/camera.py", line 3604, in _set_annotate_text

    self._check_camera_open()

    File "/usr/lib/python3/dist-packages/picamera/camera.py", line 540, in _check_camera_open

    raise PiCameraClosed("Camera is closed")

    picamera.exc.PiCameraClosed: Camera is closed


    Im Thonny-Assistant wurde parallel ausgegeben:

    Warnings

    May help you find the cause of the error.

    ProzessPool#30.py

    Line 86 : Expression "MOTION_SENSORS[0].wait_for_motion() and MOTION_SENSORS[1].wait_for_motion()" is assigned to nothing

    Bei der Suche nach "picamera.exc.PiCameraClosed:Camera is closed" entdeckte ich diese Unterhaltung.

    Demanch sieht es für mich so aus als würde das erneute Aufrufen von

    camera = picamera.PiCamera()

    den GPU-Speicher aufzehren.

    Wie könnte die Lösung aussehen?

  • Ausgehend von #30 2 Varianten zum Test.

    ---


    Demanch sieht es für mich so aus als würde das erneute Aufrufen von

    camera = picamera.PiCamera()

    den GPU-Speicher aufzehren.

    ne, die Fehlermeldung kommt, weil wir halt zuvor die Kameraressource geschlossen haben. Da die aber nur in der Main einmalig "geöffnet" und vorbereitet wird, geht es halt dann nicht mehr.

    Die vorherige Fehlermeldung gabs, weil die Ressource auch nach Beendigung des Skriptes nicht geschlossen worden ist und somit schon verwendet wird.

  • Hallo,

    Ausgehend von #30 2 Varianten zum Test.

    mir gefällt Variante 1 gut. Dann muss nicht jedes mal ein neues Objekt erstellt werden :thumbup:

    Ich Bins zu Beginn wolltest du mal, dass der Wasserwerfer und die Videoaufnahme möglichst parallel ausgeführt wird. Das ist jetzt ja laut Code nicht mehr der Fall. Ich wollte nur mal nachfragen, ob du trotzdem damit zufrieden bist oder ob man noch die Ursache für das nicht funktionieren des vorherigen Codes suchen muss?

    Grüße

    Dennis

    Edit: Ist doch parallel, Danke Hofei !

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

    Einmal editiert, zuletzt von Dennis89 (20. Oktober 2021 um 15:51)

  • Beitrag von Hofei (20. Oktober 2021 um 15:47)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.

Jetzt mitmachen!

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