Speicherzugriffsfehler

  • Hallo zusammen,

    seit einigen Tagen versuche ich mich an einem neuen Pi-Porjekt. Die Idee: Bewegungsdetektion über einen PIR-Sensor mit anschließender, zufallsbasierter Audiodateiwiedergabe für das Badezimmer. Da es mein zweites Projekt überhaupt ist, bin ich noch Neuling auf dem Gebiet. Viel gelernt habe ich durch Problemstellungen und anschließender Lösung durch Forenbeiträge. Nun sehe ich mich zum ersten Mal "gezwungen", selbst einen Beitrag zu verfassen, da ich keine Hilfestellung zu meinem Thema mehr finden kann.


    What I've done so far....

    -den Pi Model B+ grundlegend aufgesetzt

    -remote-Steuerung mittels Putty und VNC Viewer

    -Python 2.7 und 3.7 installiert, alle hier behandelten Skripte sind in der Python 3.7 Syntax geschrieben

    -kleine Aktivbox am Audiojack vom Pi

    -PIR Sensor am Pi verschaltet... das dazu passende Skript funktioniert!
    -ein Python-Skript (randommusic.py) geschrieben. Funktionsweise: Programm liest einen Ordner aus, wählt eine zufallsbasierte (Musik)Datei, anschließende Ausgabe mittels ffplay-Befehl (FFMPEG-Modul)


    Nun etwas genauer. Im PIR Skript habe ich an der Stelle, wo der Sensor eine Bewegung detektiert einen Subprocess eingebuden. Dieser Subprocess ruft eine Shell-Datei auf worin das Audio Programm gestartet wird.

    Mit einem einzelnen Pfad zur Musikdatei im Shell Skript funktioniert alles wunderbar: Das PIR-Skript wird gestartet, eine Bewegung wird erkannt, die Shell aus dem Subprocess wird aufgerufen und die hinterlegt Audiodatei wird abgespielt. Super!


    Nun zum Problem: Hinterlege ich in dem Shell Skript nun den Aufruf das zufallsbasierte Audioprogramm randommusic.py zu starten, die Zwischenschritte kann ich einsehen und es funktioniert alles wie es soll, nur bekomme ich keine Audioausgabe über meine Box

    Zur Info: Starte ich randommusic.py in der Python Umgebung Thonny via VNC, funktioniert alles inklusive anschließender Audioausgabe.

    Starte ich randommusic.py via Putty wird das Programm ausgefürt, am Ende die Info "Speicherzugriffsfehler".

    Dieser Fehler ist schätze ich der Grund, weshalb alles funktioniert, am Ende aber kein Audio ausgegeben wird.


    Wie bereits gesagt, für diesen Fehler finde ich im Netz wenig bis gar keine Lösungsvorschläge. Hat jemand eine Idee?


    Ich führe nun noch kurz die jeweiligen Skripte auf:

    Danke
    LaZZeR

    Python: Shell Skript
    #!/usr/bin/python3
    
    #ffplay /home/pi/Music/Lied.mp3
    exec(open('/home/pi/randommusic.py').read())

    Edited once, last by LaZZeR ().

  • Ich kann jetzt nicht behaupten, den Fehler auf den ersten Blick zu sehen, aber ich würde vorschlagen, in randommusic.py die shebang-Zeile in die erste Zeile der Datei zu setzen (wo sie hingehört) und außerdem einheitlich phython3 zu verwenden.

  • Ich rate mal: ffmpeg ist das Problem.

    Der Grund wieso ich zu diesem Schluss komme: Speicherzugriffsfehler passieren nur, wenn irgendwas in C gemacht wird und dort ein Problem auftritt. Dann stürzt auch der Python-Interpreter ab. Ein Problem mit einer Library kann z.B. ein Auslöser sein.


    Teste mal andere Programme zum Abspielen der Sounds.

    Code
    omxplayer
    aplay
    mplayer


    Außerdem könnte man den kompletten Code in ein Programm packen. Der Aufruf über ein Script ist nicht der beste Weg.

  • Ich kann jetzt nicht behaupten, den Fehler auf den ersten Blick zu sehen, aber ich würde vorschlagen, in randommusic.py die shebang-Zeile in die erste Zeile der Datei zu setzen (wo sie hingehört) und außerdem einheitlich phython3 zu verwenden.

    Danke für den Hinweis. Habe ich verbessert, ändert jedoch nichts am Fehler :denker:

  • Das ist wirklich grausam verschwurbelt und von hinten durch die Brust ins Auge. Den Vogel schiesst das exec ab - wo hast du das Vorgehen denn her?!?


    Wie genau da nun der segfault entsteht ist durch diese Unterprozess-Matroschka nicht nachvollziehbar. Der erste Schritt zur Lösung besteht also darin, alles in EIN Python-Skript zu tun, denn natürlich kann das PIR-Skript auch sofort den ffmpeg-Player benutzen. Dabei sollte es gleich auch auf python3 gewandet werden, nur in den shebang schreiben reicht dazu nicht, du musst Zb die Print Anweisungen ersetzen.

  • Also ich hab jetzt das Mittler randommusic.py erstellt und ausgeführt.


    python3 randommusic.py


    Da kommt das rauß:

    from ffpyplayer.player.player import MediaPlayer

    ImportError: /lib/aarch64-linux-gnu/libgomp.so.1: cannot allocate memory in static TLS block


    *edit* ist Ubuntu20.04

    hab eine Lösung gefunden:

    https://github.com/keras-team/keras-tuner/issues/317

    export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1

    * hab gedacht es ist überall so :)

  • Speicherzugriffsfehler passieren nur, wenn irgendwas in C gemacht wird und dort ein Problem auftritt.

    Einspruch! Ein Stack Overflow, der zu einem Segfault führt, kann auch ohne C-Extension erzeugt werden:

    Python
    import sys; sys.setrecursionlimit(1<<30)
    f=lambda:f(); f()

    Oder gar ohne Stack Overflow, so (von hier) :

    Python
    class E(BaseException):
        def __new__(cls, *args, **kwargs):
            return cls
    def a(): yield
    a().throw(E)

    :shy:

  • Danke für die vielen Antworten!
    Das Problem ist nun gelöst und die Anwendung funktioniert so, wie sie gedacht ist. Eine kurze Erklärung: @__deets__ hat völlig Recht, die Verknüpfungen und Aufrufe sind mehr Wirrwarr als zielführend. Ich habe daher das randommusic Skript in das vom Bewegungssensor implementiert. Somit entfällt das Shell Skript und die entsprechenden Verbindungen/Aufrufe.
    Anfangs hatte ich eine etwas andere Umsetzung vom Projekt im Kopf, bin im Netz auf neue Ideen gestoßen habe somit das Projekt erweitert, ohne zwischendurch kleinere Zwischenschritte zu hinterfragen. Heute habe ich dann den Wald vor lauter Bäumen nicht gesehen. :shy:

    Umwege durch einen anderen Player oder sonstiges entfallen somit, das randommusic Skript hatte ja schon vorher keine Probleme bei der Ausführung bereitet.


    Bleibt mir nichts anderes als Danke an alle Beteiligten zu sagen, manchmal zeigt ein kleiner Input von außen in das eigene festgefahrene Denken ja doch große Wirkung!:bravo2::danke_ATDE: