Autostart eines in Python aufgerufenen fullscreen Bilds

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

Hallo Python-Community,
dies ist mein erster Beitrag in einem Forum, bei Fehlern bitte ich um Nachsicht.
Hier mein Anliegen:
In meinem Python Script rufe ich einen subprocess zum anzeigen eines Bildes in Fullscreen auf. Zur Bildanzeige nutze ich feh als Bildbetrachter für die Konsole. Der Befehl lautet wie folgt:

Code: Alles auswählen

ImageProc = subprocess.Popen('feh -x /home/pi/Bilder/Schachbrett.jpg', Shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)
Wenn ich das Script nach Starten der GUI (startx) mit

Code: Alles auswählen

sudo python Manuellspielmodus.py
ausführe, funktioniert die Fullscreen Bildanzeige, sowie das restliche Programm. Soweit so gut.
Führe ich aber einen Autostart der GUI durch eintragen von

Code: Alles auswählen

su -l pi -c startx
in rc.local durch und starte mein Script auch automatisch durch eintragen von

Code: Alles auswählen

@reboot python /home/pi/Manuellspielmodus.py &
in die crontab, funktioniert die Bildanzeige nicht mehr, der Rest des Programmes funktioniert aber noch.

Ich vermute, dass feh auf irgend etwas zugreift, was erst nach vollständigem Hochfahren der GUI zur Verfügung steht.
Da ich nicht weiß, wie ich in der crontab einen Befehl erst nach vollständig hochgefahrener GUI ausführen lasse, habe ich die unschöne Lösung über

Code: Alles auswählen

@reboot /bin/sleep 15 && python /home/pi/Manuellspielmodus.py &
ausprobiert, was allerdings nicht funktioniert hat bzw. auch hier wurde nach Ablaufen der 15 Sekunden das Bild nicht angezeigt und der Rest vom Programm aber problemlos gestartet (obwohl die GUI ganz hochgefahren war).

Es wäre super, wenn mir jemand bei dem Problem helfen könnte.

Gruß helu
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@helu1020
Dein Problem ist eigentlich kein pythonspezifisches Problem. So ganz verstehe ich nicht, was Du eigentlich erreichen möchtest. Ein Bild anzeigen, nachdem X hochgefahren ist? Und weshalb muss das mit root-Rechten sein?
Wie auch immer, ich würde dafür weder das `rc.local` Skript noch einen `crontab` Eintrag bemühen. Vor allem `cron` eignet sich nicht unbedingt, wenn es darum geht, X Anwendungen zu starten, da aus der Umgebung heraus, aus der `cron` Anwendungen startet, so ohne weiteres kein Zugriff auf den Xserver erfolgen darf. Wie Du ja schon festgestellt hast, wurde Dein Skript zwar gestartet, `feh` durfte allerdings nicht auf den Xserver zugreifen. Du darfst nicht vergessen, dass X nicht "nur" für die Darstellung grafischer Anwendungen zuständig ist, sondern auch für Maus, Tastatur und andere Eingabegeräte. Und da möchte man aus Sicherheitsgründen nicht, dass jeder einfach darauf zugreift bzw. noch schlimmer, darauf liest... :wink:
In Deinem Fall könnte ich mir vorstellen, ein Skript unter `/etc/X11/Xsession.d` anzulegen. Wenn X startet, werden die Skripte, die in diesem Ordner liegen, der Reihenfolge nach gestartet.

Aber wie gesagt, nachdem ich nicht wirklich verstanden habe, um was es Dir tatsächlich geht, kann es jetzt auch sein, dass ich an Deinem Problem total vorbeigeschrieben hab'... :mrgreen:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo helu1020, willkommen im Forum,

Je nachdem welchen DE du nutzt gibt es eventuell auch passende Autostart-Ordner in denen du dein Skript vermerken kannst, so dass dieses nach dem Login angezeigt wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

Schon einmal vielen Dank für die schnellen Antworten.
@mutetella:
Es handelt sich um eine Projektarbeit, bei der ich letztlich eine Kugelposition auf einem kardanisch aufgehängten Touch-Display regeln möchte. Die einzelnen Schachbrettfelder meines Fullscreenbilds stellen verschiedene Positionen dar, auf denen die Kugel gehalten werden soll. Es soll einen Manuellspielmodus (Steuerung) und einen Automatikmodus (Regelung) geben. Im Manuellspielmodus soll einfach ein Schachbrett (mein Fullscreen-Bild) angezeigt werden und sich das Display je nach Joystickauslenkung neigen. Der Manuellspielmodus funktioniert auch schon. Nur wie gesagt, wird das Schachbrett-Bild beim Autostart nicht angezeigt, auch wenn die Steuerung nach dem Autostart funktioniert.
Leider hat das Kopieren meines Skriptes in '/etc/X11/Xsession.d' nicht funktioniert. :(
@Leonidas:
Mein Python Skript habe ich mit der Entwicklungsoberfläche "SPE (Stani's Python Editor)" erstellt. Wie finde ich hierzu den passenden Autostart-Ordner heraus? Oder weißt du den sogar?

Gruß helu1020
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Leonidas meinte mit DE ein Desktop Environment und keine IDE. Also schreib mal welche Desktop Umgebung du verwendest.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Wenn es ein Raspberry Pi ist, dann wird es wahrscheinlich Lxde sein.
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

Oh, sorry. Ich dachte DE steht für "Development Environment".
Als Desktop Umgebung benutze ich das auf Debian Wheezy basierende Raspbian.

Für jegliche Hilfe oder Anregungen, um das Problem zu lösen, bin ich sehr dankbar.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

helu1020 hat geschrieben:Als Desktop Umgebung benutze ich das auf Debian Wheezy basierende Raspbian.
Das ist keine Desktopumgebung, das ist ein Betriebssystem. Aber wenn du die Standardoberfläche nutzt, dann wird dies wie Hellstorm richtig angemerkt hat, LXDE sein.

Es gibt einen Eintrag zu LXDE und Autostart im LXDE-Wiki, wo letztendlich steht dass du eine ``/home/deinuser/.config/autostart/deinskript.desktop`` anlegen musst mit etwa folgendem Inhalt:

Code: Alles auswählen

[Desktop Entry]
Type=Application
Exec=dein-script.py -o -p -t -i -o -n -e -n
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

Nachdem viele verschiedene Autostartlösungen (darunter auch die von Leonidas beschriebene Methode) zwar das Programm ausgeführt haben, jedoch die Bildanzeige nicht funktioniert hat, habe ich nun eine Lösung gefunden, bei der alles (auch die Bildanzeige) funktioniert.
Ich habe mittels

Code: Alles auswählen

nano .bashrc
ganz am Ende der .bashrc Datei folgende Zeile eingefügt:

Code: Alles auswählen

sudo python Manuellspielmodus.py
Dadurch wurde beim Starten des LXTerminals automatisch das Programm gestartet (mit Bildanzeige).
Nun habe ich das LXTerminal durch folgende Eingaben automatisch starten lassen:

Code: Alles auswählen

sudo nano /etc/xdg/lxsession/LXDE/autostart
Am Ende der autostart Datei

Code: Alles auswählen

@lxterminal
eintragen, fertig.

Ist vielleicht nicht der sauberste Weg, aber einer der Funktioniert (auch wenn Zugriff auf den X-Server benötigt wird, für beispielsweiße grafische Anzeigen)!

Ich hoffe das hilft auch Anderen, zum Lösen eines ähnlichen Problems.

Gruß helu1020
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

BlackJack

@helu1020: Das ist aber ziemlich unschön weil man sich damit jeden Shellstart mit dem Programm ”versaut”, d.h. man kann *keine* Bash mehr starten ohne dass dieses Programm gestartet wird. Es wäre doch viel einfacher in der `/etc/xdg/lxsession/LXDE/autostart` nicht nur den Start vom ``lxterminal`` einzutragen, sondern *dem* und *dort* auch gleich mit auf den Weg zu geben was es ausführen soll. Also in die Datei ``@lxterminal -e 'sudo python Manuellspielmodus.py'`` einzutragen. Eventuell muss man die Argumente anpassen, ich weiss nicht was ``lxterminal`` da so erwartet um etwas auszuführen.
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

@BlackJack: Ja, du hast Recht. Funktioniert auch so und ist etwas schöner. Super, danke.
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

Hallo Zusammen,
ich habe inzwischen noch eine Frage zu dem Thema.
Gibt es eine Option um die Konsole zwar wie beschrieben zu starten, aber gleich minimiert?
Gruß helu1020
BlackJack

@helu1020: Brauchst Du das Terminal den überhaupt?
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

@BlackJack: Lediglich einmalig zum Starten des Programms. Dafür muss ich aber übers Terminal gehen, da ansonsten die Bildanzeige des Programms nicht funktioniert (weil kein X-Server zugriff besteht).
BlackJack

@helu1020: Den Zusammenhang verstehe ich jetzt nicht. Du kannst das Terminal starten, das braucht auch einen X-Server, also kann das Terminal nicht notwendig sein um einen X-Server zu haben. Der ist offensichtlich schon vorher da.
helu1020
User
Beiträge: 12
Registriert: Montag 4. August 2014, 19:38

@BlackJack: Habe das hier her: http://developer-blog.net/hardware/rasp ... rogrammen/
Ganz unten steht, dass nach dieser Methode eine grafische Ausgabe in einem Fenster (aus dem Python Script heraus) geöffnet wird.
Was meiner Erfahrung nach mit alternativen Autostartmethoden des Python Scripts nicht funktioniert.
BlackJack

@helu1020: In dem Blogbeitrag wird genau das gemacht was ich gesagt habe: Das *Pythonprogramm* *direkt* gestartet, *ohne* ein Terminal, das man dann extra minimieren müsste. Also noch einmal die Frage: Wozu brauchst Du das *Terminal* bei dieser Geschichte‽
Antworten