Seite 1 von 1

Autostart Python3-Script - Script tut nichts, aber 100%cpu?

Verfasst: Dienstag 14. Januar 2014, 20:41
von neovanmatix
Hallo,

ich habe - als Entwurf - ein kurzes Python3-Script geschrieben, dass ich auf einem Raspberry Pi mit Raspbian beim Start ausführen möchte.
Bisher habe ich vorige Scripte per "@reboot python3 script.py" in den crontab geschrieben; gerade habe ich auch den Weg über die rc.local versucht.

Beim Autostart wird das Script zwar im Hintergrund gestartet, jedoch verbraucht es 100% CPU und funktioniert nicht (es schaltet einen GPIO wenn der Bildschirmschoner aktiviert/deaktiviert wird, um eine Hintergrundbeleuchtung an- bzw. auszuschalten).

Kille ich den Prozess und führe das Script erneut per "python3 script.py" aus, funktioniert es wie erwartet.

Woran könnte das liegen? Sollte doch eigentlich im gleichen Kontext gestartet werden?

Edit: Ich habe so das Gefühl, dass das Script immer dann zickt, wenn kein Benutzer (z.B. per SSH) eingeloggt ist. Die lokale Sitzung + Display mit X11 ist aber gestartet.
Starte ich das Script per Putty mit & am Ende und schließe daraufhin die letzte Putty-Sitzung, funktioniert's auch nicht mehr? Der GPIO wird also nicht geschaltet, und somit bleibt das Display aus :/

Code: Alles auswählen

import subprocess

subprocess.Popen(['sudo', 'sh', '-c', 'echo 252 > /sys/class/gpio/export'])
subprocess.Popen(['sudo', 'sh', '-c', 'echo "out" > /sys/class/gpio/gpio252/direction'])
subprocess.Popen(['sudo', 'sh', '-c', 'echo "1" > /sys/class/gpio/gpio252/value'])

process = subprocess.Popen(['xscreensaver-command','-watch'], stdout=subprocess.PIPE)
for line in iter(process.stdout.readline, ''):
    read_line = line.decode("utf-8")
    if "BLANK" in read_line and not "UNBLANK" in read_line:
        print("Bildschirmschoner aktiviert")
        subprocess.Popen(['sudo', 'sh', '-c', 'echo "0" > /sys/class/gpio/gpio252/value'])
    if "UNBLANK" in read_line:
        print("Bildschirmschoner deaktiviert")
        subprocess.Popen(['sudo', 'sh', '-c', 'echo "1" > /sys/class/gpio/gpio252/value'])

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

Re: Autostart Python3-Script - Script tut nichts, aber 100%c

Verfasst: Dienstag 14. Januar 2014, 21:33
von BlackJack
@neovanmatix: Ist X denn zu dem Zeitpunkt wo das Skript beim neustart des Systems anläuft denn schon gestartet?

Und das ``&`` nicht ausreicht ist klar. Wenn das Terminal, also der Elternprozess wegbricht, dann werden auch asynchron laufende Kindprozesse beendet. Da müsstest Du mit ``nohup``, ``screen``, oder ``tmux`` arbeiten. Eines der letzten beiden verwende ich gerne zusammen mit, beziehungsweise über ``byobu``.

Re: Autostart Python3-Script - Script tut nichts, aber 100%c

Verfasst: Mittwoch 15. Januar 2014, 13:34
von neovanmatix
Hallo,

als ich das Script per rc.local gestartet habe, wurde 1-2 Zeilen vorher der X-Server gestartet.
Es wäre also etwas anderes, wenn ich "screen python3 script.py" ausführen würde? Hm.. heute Abend mal testen. Danke!

Re: Autostart Python3-Script - Script tut nichts, aber 100%c

Verfasst: Sonntag 19. Januar 2014, 16:44
von Hellstorm
Wieso nutzt du eigentlich nicht RPi.GPIO? Dann musst du dich nicht so blöd mit Subprocess herumschlagen.

https://pypi.python.org/pypi/RPi.GPIO

Re: Autostart Python3-Script - Script tut nichts, aber 100%c

Verfasst: Sonntag 19. Januar 2014, 19:22
von neovanmatix
Hellstorm hat geschrieben:Wieso nutzt du eigentlich nicht RPi.GPIO? Dann musst du dich nicht so blöd mit Subprocess herumschlagen.

https://pypi.python.org/pypi/RPi.GPIO
Hallo,
weil ich nicht wusste, das ich damit auch "nicht-standard-GPIO's" schalten kann?
Wenn ich das richtig verstanden habe, sitzen extra GPIOs auf dem TFT-Controller für die Hintergrundbeleuchtung.

Re: Autostart Python3-Script - Script tut nichts, aber 100%c

Verfasst: Sonntag 19. Januar 2014, 19:54
von Hellstorm
Achso, wusste ich nicht. Vielleicht kann man das im Quellcode des Moduls ja ändern. Ich hab damit nur mal einige LEDs geschaltet :D

Re: Autostart Python3-Script - Script tut nichts, aber 100%c

Verfasst: Montag 20. Januar 2014, 05:07
von pillmuncher

Code: Alles auswählen

    if "BLANK" in read_line and not "UNBLANK" in read_line:
        bla()
    if "UNBLANK" in read_line:
        blubb()
Warum nicht:

Code: Alles auswählen

    if "UNBLANK" in read_line:
        blubb()
    elif "BLANK" in read_line:
        bla()
Ja, es gibt elif.