Fehlermeldung "UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81"

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
manwald
User
Beiträge: 3
Registriert: Montag 31. Mai 2021, 20:47

Hallo zusammen,

ich hoffe, ihr könnt mir helfen.

Ich habe einen Xiaomi Mi Router 4C, den ich gerne mit OpenWRT flashen möchte. Die dafür benötigten Dateien habe ich hier und sollte eigentlich nur eine 'backup.bat'-Datei starten, die zunächst ein Backup erstellt.

Hier gehen die Probleme allerdings schon los, und ich vermute, dass hat mit meinem 'deutschen' Windows-PC zu tun, denn die Dateien sind alle von englischsprachigen Usern erstellt worden.
Denn nach dem Start der bat-Datei erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "main/main.py", line 19, in <module>
    line4 = subprocess.check_output(["cmd","/c","chcp","437","&","tracert","-d","-h","1","1.1.1.1"]).decode().split("\r\n")[4].strip().split(" ")
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 53: invalid start byte
Die 'backup.bat' ist simpel und sieht wie folgt aus:

Code: Alles auswählen

@echo off
python main/main.py
pause
Die aufgerufene main.py habe ich hier hochgeladen:
https://pastebin.pl/view/2ef65ab8

Die im Archiv enthaltene phyton.exe ist Version 3.7.7150.1013, falls das eine Rolle spielt.

Habt ihr eine Ahnung, was der Fehler sein könnte?

Vielen Dank für eure Hilfe und viele Grüße
Mischa
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Das Python Script ruft mit subprocess.check_output() ein externes Programm auf und möchte dessen Ausgabe verarbeiten. check_output() liefert Bytes zurück, weil das Encoding von dem Output des Programms abhängt, das aufgerufen wurde. Das Script ruft .decode() auf dem Output auf, um es in eine Zeichenkette zu wandeln - und scheitert dann, weil die Bytes offensichtlich nicht UTF-8 kodiert sind.
manwald
User
Beiträge: 3
Registriert: Montag 31. Mai 2021, 20:47

Danke für die Erklärung!

Leider ist Python für mich totales Neuland. Hast du einen Tipp, was ich tun kann, um diesen Fehler zu beseitigen?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst das Kommando das da abgesetzt wird auch einfach in der Kommandozeile selbst starten, die 5te (computer zählen ab 0) Zeile nehme, und in das Skript kopieren. Oder “decode()” in dem Skript mit “decode(errors='ignore')” ersetzen, und ein bisschen beten.
manwald
User
Beiträge: 3
Registriert: Montag 31. Mai 2021, 20:47

__deets__ hat geschrieben: Montag 31. Mai 2021, 22:46 Du kannst das Kommando das da abgesetzt wird auch einfach in der Kommandozeile selbst starten, die 5te (computer zählen ab 0) Zeile nehme, und in das Skript kopieren. Oder “decode()” in dem Skript mit “decode(errors='ignore')” ersetzen, und ein bisschen beten.
Okay, Danke dir. Werde ich mal versuchen :-)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@manwald

Du initialisiert die Console mit `chcp 437`, d.h. als 8bit encoding CP437. Bin leider zulange aus Windows raus, allerdings würde ich jetzt erwarten, dass `tracert` das als STDOUT encoding zurückliefert, ergo singuläre 8bit Zeichen erlaubt sind. Diese sind dann per Definition nicht UTF8 gängig.

`check_output` kennt ein encoding parameter, versuch mal diesen auf CP-437 zu setzen.
Antworten