Forum: PC-Programmierung Problem beim automatischem starten von Python-Script auf Raspberry P


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich habe ein Python-Script für den Raspberry PI geschrieben. Das Script 
habe ich auf dem Verzeichnis
1
home/pi/KopieSoftware/Stellpultsteuerung.main.py
liegen. Es gibt noch weitere Dateien, welche dazu gehören. unter anderem 
unter dem Verzeichnis
1
home/pi/KopieSoftware/Stellpultsteuerung/tty
mehrere Schriftartdateien zum Anzeigen von Schrift auf einem Display 
über die SPI-Schnittstelle.

Wenn ich auf der Konsole (es ist auf dem Raspberry keine Grafik 
installiert) in das Verzeichnis
1
/home/pi/KopieSoftware/Stellpultsteuerung/
gehe und dort per
1
python3 main.py
das Script starte dann lauft alles ohne Probleme.

Starte ich das Script mit der Zeile
1
python3 home/pi/KopieSoftware/Stellpultsteuerung.main.py
bekomme ich folgende Meldung:
1
pi@stellpult:~ $ python3 /home/pi/KopieSoftwareStellpultsteuerung/main.py
2
Exception in thread Thread-1:
3
Traceback (most recent call last):
4
  File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
5
    self.run()
6
  File "/home/pi/KopieSoftwareStellpultsteuerung/kommunikation.py", line 46, in run
7
    schrift_klein = ImageFont.truetype('./ttf/FreePixel.ttf', 16)
8
  File "/usr/lib/python3/dist-packages/PIL/ImageFont.py", line 280, in truetype
9
    return FreeTypeFont(font, size, index, encoding, layout_engine)
10
  File "/usr/lib/python3/dist-packages/PIL/ImageFont.py", line 145, in __init__
11
    layout_engine=layout_engine)
12
OSError: cannot open resource

Das Script arbeitet mit mehreren Threads, der Aufruf das Einbinden der 
Schriftartendateien erfolgt in der Datei "kommunikation.py" mit den 
Zeilen
1
# ******************** Schriftarten initialisieren ********************
2
        schrift_klein = ImageFont.truetype('./ttf/FreePixel.ttf', 16)
3
        schrift_gross = ImageFont.truetype('./ttf/FreePixel.ttf', 32)
4
        schrift_zahlenwerte = ImageFont.truetype('./ttf/Topaznew.ttf', 64)

Woran kann das liegen? Mein Problem damit ist das ich das Script später 
beim Starten automatisch über einen Eintrag in der rc.local ausführen 
lassen will. Da geht das ganze dann auch schief. Hier sehe ich zwar 
keine Fehlermeldung, aber ich vermute es hat die gleiche Ursache.

Ich hatte auch schon versucht die Dateien nicht per relativem sondern 
absolutem Link einzubinden. Gleiches Ergebnis.

von Stefan B. (stefan_b278)


Lesenswert?

Entweder absoluten Pfad angeben (auch die in kommunikation.py) oder den 
ganzen Pfad einbinden:
1
import sys
2
sys.path.append("/home/pi/KopieSoftware/Stellpultsteuerung/tty")
Dann müsste er automatisch die Dateien finden.

Achja mach dir mal klar warum man am Anfang der Datei
1
#!/usr/bin/env python3
schreiben und die Datei direkt aufrufen kann (ohne "python3" davor) wenn 
sie ausführbare Dateiattribute hat.

: Bearbeitet durch User
von Klaus H. (klummel69)


Lesenswert?

Stefan B. schrieb:
> import sys
> sys.path.append("/home/pi/KopieSoftware/Stellpultsteuerung/tty")

Versuche noch den Pfad ohne /tty einzubinden, da die Pfadangaben in 
deinem Dateien das Verzeichnis tty schon angeben.

von Rolf M. (rmagnus)


Lesenswert?

R. F. schrieb:
> Woran kann das liegen?

R. F. schrieb:
> schrift_klein = ImageFont.truetype('./ttf/FreePixel.ttf', 16)

./ ist das aktuelle Verzeichnis.

Wenn du das hier machst:
R. F. schrieb:
> Wenn ich auf der Konsole (es ist auf dem Raspberry keine Grafik
> installiert) in das Verzeichnis /home/pi/KopieSoftware/Stellpultsteuerung/
> gehe

setzt du das aktuelle Verzeichnis auf 
/home/pi/KopieSoftware/Stellpultsteuerung/, und deine ttf-Datei wird 
dort gesucht.

Wenn du das hier machst:

R. F. schrieb:
> python3 home/pi/KopieSoftware/Stellpultsteuerung.main.py

Dann ist das aktuelle Verzeichnis eben das, wo du gerade bist, wenn du 
das aufrufst, und dort wird nach der ttf-Datei gesucht.

von R. F. (inet_surfer88)


Lesenswert?

Ich hatte oben ja bereits geschrieben das absolute Pfade keinen Erfolg 
brachten. Gleiche Fehlermeldung.

Ich habe jetzt in der main.py wie vorgeschlagen die Zeile
1
#!/usr/bin/env python3
ergänzt und mit
1
chmod 700 main.py
ausführbar gemacht. Ergebnis danach ist
1
pi@stellpult:~/KopieSoftwareStellpultsteuerung $ ls -al
2
insgesamt 44
3
drwx------ 5 pi pi 4096 Jan  2 09:47 .
4
drwxr-xr-x 7 pi pi 4096 Jan  1 21:55 ..
5
-rw------- 1 pi pi  365 Jan  1 10:16 cfg.py
6
drwx------ 2 pi pi 4096 Jan  1 22:15 grafik
7
-rw------- 1 pi pi 2411 Nov 21 22:09 klimawerte.py
8
-rw------- 1 pi pi 8677 Jan  1 21:36 kommunikation.py
9
-rwx------ 1 pi pi  632 Jan  2 09:46 main.py
10
drwxr-xr-x 2 pi pi 4096 Jan  1 22:19 __pycache__
11
drwx------ 2 pi pi 4096 Jan  1 22:15 ttf

Wenn ich es jetzt ohne Python3 davor starte kommt:
pi@stellpult:~/KopieSoftwareStellpultsteuerung $ /home/pi
1
/KopieSoftwareStellpultsteuerung/main.py
2
/usr/bin/env: „python3\r“: Datei oder Verzeichnis nicht gefunden

Danach habe ich folgendes ergänzt:
1
import sys
2
sys.path.append("/home/pi/KopieSoftware/Stellpultsteuerung")
Jetzt kommt:
1
pi@stellpult:~ $ /home/pi/KopieSoftwareStellpultsteuerung/main.py
2
-bash: /home/pi/KopieSoftwareStellpultsteuerung/main.py: Keine Berechtigung

Der Aufruf per
1
python3 main.py
direkt im Verzeichnis funktioniert nach wie vor ohne Probleme

Generelle Frage: Muss
1
#!/usr/bin/env python3
vor jede einzelne Python-Datei? Ich würde sagen in der Main genügt es, 
oder habe ich das falsch verstanden?

von Rolf M. (rmagnus)


Lesenswert?

R. F. schrieb:
> Ich hatte oben ja bereits geschrieben das absolute Pfade keinen Erfolg
> brachten. Gleiche Fehlermeldung.

Du meinst, er meldet da auch, das ./ttf/FreePixel.ttf nicht gefunden 
wird?

R. F. schrieb:
> Wenn ich es jetzt ohne Python3 davor starte kommt:
> pi@stellpult:~/KopieSoftwareStellpultsteuerung $
> /home/pi/KopieSoftwareStellpultsteuerung/main.py
> /usr/bin/env: „python3\r“: Datei oder Verzeichnis nicht gefunden

Das sieht aus, als ob du die Datei im DOS-Modus gespeichert hast, also 
mit falschen Zeilenenden. Dann musst du sie ins UNIX-Format 
konvertieren. Dafür gibt's z.B. das Kommandozeilen-Tool dos2unix, das du 
aber vermutlich erst installieren musst. Oder halt deinen Editor auf 
UNIX-Zeilenenden stellen.

R. F. schrieb:
> Generelle Frage: Muss#!/usr/bin/env python3
> vor jede einzelne Python-Datei?

Vor jede, die du direkt ausführen willst, ohne den Interpreter manuell 
hinschreiben zu müssen.

von Sascha W. (sascha-w)


Lesenswert?

@r.f.

Wenn du das als Dienst laufen lassen willst, dann solltest du das mit 
systemd und nicht mehr mit dem alten rc.local machen.
In der Unit für deinen Dienst kannst du auch das Arbeitsverzeichnis 
angeben, und dann läuft das auch.

Sascha

von R. F. (inet_surfer88)


Lesenswert?

Hallo,

mittlerweile läuft es. Ich starte es jetzt in der rc.local mit
1
python3 home/pi/KopieSoftware/Stellpultsteuerung.main.py
und ich habe absolute Pfade im Script angegeben.

Ich habe aktuell keinen Zugriff auf das Projekt. Am Wochenende wenn ich 
wieder vor Ort bin werde ich nochmals testen um auch die Zusammenhänge 
zu verstehen. So ganz klar sind mir einige Sachen noch nicht. Ich werde 
mich dann nochmals melden.

Ich werde mir auch das mit dem systemd anschauen.

Wegen dem Hinweis mit dem Editor.
Geschrieben habe ich das mit Pycharm unter Windows und habe es dann auf 
den Raspberry kopiert. Einstellung ist "UTF-8" und "CRLF - Windows". Es 
läuft jetzt zwar, aber ich denke für den Raspberry sollte das dann auf 
"LF - Unix"???

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.